次のディレクトリツリーがあります。
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 globstar
bash内)を設定し、さらにコマンドを使用してパスコンポーネントをインポートするか、dirname
パラメータ拡張を再利用します。
答え2
別の解決策:
find records -type f -iname '*.mpg' | xargs rename 5.mpg 0.mpg
名前を変更したいファイルはすべて* 5.mpgで終わるため、この組み合わせfind
がrename
適しています。
答え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