私は多くのディレクトリを持っています。これらのそれぞれには、特定の拡張子を持つファイルがあります.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
に移動され、関数を呼び出すたびに以前に移動したファイルが上書きされます。Parent
mv
注:パラメータを使用して機能させることはできません-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