特定の条件が満たされると、ファイルを繰り返し移動します。

特定の条件が満たされると、ファイルを繰り返し移動します。

次のディレクトリツリーがあります。

records/13/2014.12.16/00/05.mpg
records/13/2014.12.16/00/15.mpg
records/13/2014.12.16/01/05.mpg
records/13/2014.12.16/02/15.mpg
records/15/2014.12.14/05/25.mpg
etc.

*5.mpg名前に含まれるすべてのファイルの名前を変更する必要があります*0.mpg。たとえば、次のようになります。

mv records/13/2014.12.16/00/05.mpg records/13/2014.12.16/00/00.mpg
mv records/13/2014.12.16/00/15.mpg records/13/2014.12.16/00/10.mpg
mv records/15/2014.12.14/05/25.mpg records/15/2014.12.14/05/20.mpg
etc.

これを行うには、bashスクリプトを書く必要があることを知っています。残念ながら、私はうまくいかず、助けを求めることになりました。すべてのディレクトリ(再帰部分)に移動し、名前に*5.mpg

答え1

すべてのファイルを繰り返して*.5mpg、パラメータ拡張の助けを借りてファイル名を変更してください。

for file in *5.mpg; do mv -- "$file" "${file%5.mpg}"0.mpg; done

他のディレクトリに対してこれを行うには、globstarオプション(shopt -s globstarbash内)を設定し、さらにコマンドを使用してパスコンポーネントをインポートするか、dirnameパラメータ拡張を再利用します。

答え2

別の解決策:

find records -type f -iname '*.mpg' | xargs rename 5.mpg 0.mpg

名前を変更したいファイルはすべて* 5.mpgで終わるため、この組み合わせfindrename適しています。

答え3

実際にスクリプトを書いてみました。これはうまくいくようです:

#!/bin/bash

find . -type f -iname "*5.mpg" -print0 | while IFS= read -r -d $'\0' line; do
   new=${line//5.mpg}
   zero="0.mpg"
   buffer=$new$zero
   new=$buffer
   mv $line $new
   echo "Moving $line"
done

関連情報