sed を使用してファイル名から文字列を移動するか、名前を変更します。

sed を使用してファイル名から文字列を移動するか、名前を変更します。

二重サフィックス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" *

関連情報