二重サフィックスavi.aviがあるフォルダに複数のビデオファイルがあります。
find /home/alex/Filme/ -type f -name '*.avi.avi'
/home/alex/Filme/Super 8.avi.avi
/home/alex/Filme/Exit - A Night From Hell.avi.avi
/home/alex/Filme/Der Plan.avi.avi
/home/alex/Filme/Ich.bin.Nummer.4.2011.avi.avi
snipp
次の「スクリプト」を使用して二重文字列を削除しようとしています。
#!/bin/bash
for i in `find $HOME/Filme -type f -name '*avi.avi' -print0`
do
sed -e 's/'*.avi.avi'/'*.avi'/g'
done
それとも、このように名前を変更することでこれを達成するより良い方法はありますか?
find $HOME/Filme -type f -name '*avi.avi' -print0 -exec sh -c rename -v 's/*.avi.avi/*.avi/g' {} \;
フォルダ名が保持されているかどうかはわかりません。はい、これについていくつかの質問と回答を見つけましたが、それを私の状況に適用するのが難しいです。
私の方法の1つがうまくいくでしょうか?
答え1
ほぼすべて来ました。
find $HOME/Filme -type f -name '*avi.avi' -exec \
sh -c "rename -v 's/\.avi\.avi$/.avi/'" {} \;
(引数はrename
正規表現の置換です。/g
このオプションは、一致するファイル名のすべての項目を置き換えたい場合にのみ便利です。ただし、定義によると、最後に一致するものは1つしかありません。)
おそらくより有用には、このタスクをバッチ処理して移植性を向上させるためにも使用できますmv
。
find $HOME/Filme -type f -name '*avi.avi' -exec \
sh -c 'for f; do mv -v "$f" "${f%.avi}"; done' _ {} +
サブディレクトリを参照する必要がない場合
for f in $HOME/Filme/*.avi.avi; do
mv -v "$f" "${f%.avi}"
done
答え2
簡単に使用名前を変更する(真珠実装)コマンド:
rename 's/(.*\.avi)\.avi$/$1/' /home/alex/Filme/*.avi.avi
または、最後の.avi
部分だけを削除してください。
rename 's/\.avi$//' /home/alex/Filme/*.avi.avi
答え3
このコードを使用してこれらのファイルの名前を変更します。
rename -v "s/\.avi$//g" *