2

複数のサブフォルダーにファイルがあり、それらすべてを1つのフォルダーに移動したいと思います。次に、それらのファイルの名前を変更します。

/foo/A1000-foobar1412.jpg
/foo/A1000-foobar213.jpg
/foo/A1000-foobar314.jpg
/foo1/B1001-foobar113.jpg
/foo2/C1002-foobar1123.jpg
/foo2/C1002-foobar24234.jpg

私が取得したいのは:

../bar/A1000-1.jpg
../bar/A1000-2.jpg
../bar/A1000-3.jpg
../bar/B1001-1.jpg
../bar/C1002-1.jpg
../bar/C1002-2.jpg

だから私がこれまでにやっていることは:

find . -name "*.jpg" -exec mv {} ../bar/ \;

しかし今、私はファイルの名前を変更することに固執しています。

4

2 に答える 2

2

ファイルの目的のベース名を取得し、同じベース名を持つファイルがターゲットディレクトリに既に存在する数に応じて増分インデックスを追加するスクリプトを次に示します。

for file in $(find . -name "*.jpg")
do
  bn=$(basename $file)
  target_name=$(echo $bn | cut -f 1 -d "-")
  index=$(($(find ../bar -name "$target_name-*" | wc -l) + 1))
  target="${target_name}-${index}.jpg"

  echo "Copy $file to ../bar/$target"
  # mv $file ../bar/$target
  cp $file ../bar/$target
done

このソリューションでは、mv の前にエコーを置いてテストすることはできません。これは、コードがターゲット ディレクトリ内の実際のファイルに依存してインデックスを計算するためです。代わりに cp (または rsync) を使用し、結果に満足したらすぐに手動でソース ファイルを削除してください。

于 2012-11-27T18:01:39.817 に答える
1

これを試してください(テストされていません):

for file in `find . -name "*.jpg" `
do
  x=$(echo $file | sed 's|.*/||;s/-[^0-9]*/-/;s/-\(.\).*\./-\1./')
  mv $file ../bar/$x
done
于 2012-11-27T11:58:49.653 に答える