1

画像を含むフォルダーがあり、それらを別の場所にコピーして、進行中の特殊文字を削除する必要があります。私がこれを持っているとしましょう

Folder1/ImageÑ%1.jpg
Folder1/ImageÑ%1-70x70.jpg
Folder1/ImageÑ%2.jpg
Folder1/ImageÑ%2-70x70.jpg
Folder1/ImageÑ%3.jpg
Folder1/ImageÑ%3-100x100.jpg
Folder1/ImageÑ%4.jpg
Folder1/ImageÑ%4-100x100.jpg

そして、名前に「-70x70」または「-100x100」を含まないファイルだけをFolder2にコピーし、次のようにしたい(特別な文字なし):

Folder2/Image1.jpg
Folder2/Image2.jpg
Folder2/Image3.jpg
Folder2/Image4.jpg

ファイルをコピーすることはできましたが、同じ手順でファイルの名前を変更する (および特殊文字を削除する) 方法がわかりません。SEDを使用していると思いますが、方法がわかりません。

find Folder1 -type f -regextype posix-extended \( ! -regex '.+\-[0-9]{2,4}x[0-9]{2,4}\.jpg' \) -print0 |  xargs -0 cp -p --target-directory=Folder2

ありがとう!

4

3 に答える 3

4

変な文字を削除するには、デトックスをお勧めします

それで :

find Folder1 \( ! -name 'Image*-70x70*' -a ! -name 'Image*-100x100*' \) |
    xargs -i% cp -p % Folder2

編集

説明を見つける:

  • !性格は否定
  • -aオプションはAND条件です
  • 括弧は条件を囲むためにあります

編集2

あなたが尋ねるようにその場でそれを行うには(奇妙な文字を置き換えるため):

find Folder1 \( ! -name 'Image*-70x70*' -a ! -name 'Image*-100x100*' \) \
    -exec bash -c '
        file=$(echo "$1" | perl -pe "s/\303\221%/_weird_/g")
        cp -p "$1" "Folder2/$file"
    ' -- {} \;
于 2012-10-01T17:17:14.997 に答える
2

これはおそらくあなたのために働くでしょう:

#!/bin/bash
DIR=/your/Folder1
DEST=/your/Folder2

for f in `ls -1 $DIR | grep .jpg | egrep -v ".+\-[0-9]{2,4}x[0-9]{2,4}\.jpg"`
do
        f=$(basename $f)
        F=$(echo "$f" | sed "s/[^A-Z|a-z|0-9|\.]//g;")
        cp -p "$DIR/$f" "$DEST/$F"
done

必要に応じて、CP の代わりに MV を使用できます。

編集済み

これにより、コピーする必要があるファイルのみが取得されます。

ls -1 $DIR/*.jpg | egrep -v ".+\-[0-9]{2,4}x[0-9]{2,4}\.jpg

basenameコマンドは、堰の文字を置き換えてsedを移動する準備をするためにファイル名のみを取得し、 文字と数字(およびファイル拡張子のドット)でない場合はすべての文字を置き換えます

于 2012-10-01T18:10:42.710 に答える
1

もしかしてこういうこと?

for file in Folder1/*.jpg; do
  case $file in
    *-70x70.jpg | *-100x100.jpg) ;;
    *) cp "$file" "Folder2/Image${file#Folder1/Image?}" ;;
  esac
done

この構文は、 の値の先頭から${variable#pattern}一致するものをすべて削除します。このパターンは、リテラル テキスト(静的部分を先頭に追加) と 1 つの任意の文字に一致します。pattern$variableFolder1/Image?Folder1/ImageImage

問題の文字が 1 バイトでない場合は、最初に疑問符を 2 つ並べてみてください。これは、2 つの任意の文字 (ロケールなどがそのように構成されている場合はバイト) と一致します。結合 Unicode シーケンスがある場合は、それよりもはるかに多くの時間がかかります。ただし、ファイル名を表すために使用される実際のバイトの 16 進ダンプは、これを診断するのに役立ちます。とにかく、代わりにもう一方の端から単純にトリミングすることもできますが、それはもう少し複雑になります。

  *) base=${file#Folder1/}
     prefix=${base%%[0-9]*}
     cp "$file" "Folder2/Image${base#$prefix}" ;;

バリアントは先頭ではなく末尾からトリムし、 or${variable%pattern}を 2 倍にすると、シェルは最短一致ではなく最長一致をトリミングします。(可能な最長のマッチングは Bash 拡張機能だと思いますか?)#%

于 2012-10-01T17:54:12.653 に答える