すべてのサブディレクトリで、特定の拡張子を持つすべてのファイルの名前を変更します。

すべてのサブディレクトリで、特定の拡張子を持つすべてのファイルの名前を変更します。

私は多くのディレクトリを持っています。これらのそれぞれには、特定の拡張子を持つファイルがあります.ext

このファイルの名前を変更したいと思います。

例:

// Note: The names are random, can have spaces and special characters

Parent
 |
 |- First Directory
 |   |
 |   |- Some file.txt
 |   |- Another one.pdf
 |   `- The one to rename.ext
 |
 |- Second Directory
 |   |
 |   |- Some file.txt
 |   |- Another one.pdf
 |   `- The one to rename.ext
[…]

.extすべての拡張子をに変更したいと思いますnew name.ext2。ディレクトリごとに1つのファイルしかないので.ext問題はありません。

これまで私がしたことは次のとおりです。

find ./Parent -name "*.ext" -exec mv "{}" "{}.ext2" \;

私はそれらをたくさん持っていますThe one to rename.ext.ext2が、名前を変えるのをやめましたnew name.ext2。これをの2番目の引数に設定すると、そのファイルはディレクトリmvに移動され、関数を呼び出すたびに以前に移動したファイルが上書きされます。Parentmv

注:パラメータを使用して機能させることはできません-exec bash -c ''。私は以下を試しました:

find ./Parent -name "*.ext" -exec bash -c 'mv {} "$(dirname {})/new name.ext2"' \;

$()しかし、以前は拡張の問題がありました。{}

答え1

-printf関数を使用してfindコマンドを設定できます。

find /tmp -name "*.ext" -printf "mv %p %h/new_name.ext"
mv /tmp/foo.ext /tmp/new_name.ext

コマンドを次のようにまとめると$()

$(find /tmp -name "*.ext" -printf "mv %p %h/new_name.ext")
find /tmp -name "*.ext"
/tmp/new_name.ext

修正する:

上記のコマンドは複数のファイルを正しく処理できず、引用符付き値を使用しません。代わりに、次のコマンドを使用してください。

find /tmp -name \*.ext\*
/tmp/dir with space/bar.ext
/tmp/foo.ext

bash -x < <(find /tmp -name "*.ext" -printf "mv \"%p\" \"%h/new_name.ext2\"\n")
+ mv '/tmp/dir with space/bar.ext' '/tmp/dir with space/new_name.ext2'
+ mv /tmp/foo.ext /tmp/new_name.ext2

find /tmp -name \*.ext\*
/tmp/dir with space/new_name.ext2
/tmp/new_name.ext2

答え2

使用sed

for file in */*.ext; do
    ext2=`echo $file | sed 's/.ext/.ext2/'`
    mv $file $ext2
done

関連情報