ディレクトリに名前が 。形式のファイルが複数あります*.foo.bar
。部分を削除して各ファイルの名前を変更するbashスクリプトを作成したいと思います.foo
。
たとえば、tree ~/dir/
返品を考えてみましょう。
/home/user/dir/
|- george.foo.bar
|- john.foo.bar
|- paul.foo.bar
|- ringo.foo.bar
|- subdir
|- jimmy.foo.bar
|- robert.foo
その後、実行するとscript ~/foo/
内容が~/foo
次に変わります。
/home/user/dir/
|- george.bar
|- john.bar
|- paul.bar
|- ringo.bar
|- subdir
|- jimmy.bar
|- robert.foo
答え1
パラメータ拡張メカニズムを使用できます。
shopt -s globstar
for file in **/*foo.bar; do
prefix="${file%.foo*}"
suffix="${file##*.foo}"
mv -v -- "$file" "$prefix$suffix"
done
一致するサフィックスを削除し${file%.foo*}
(プレフィックスのみを残し)、${file#*.foo}
プレフィックスを削除します(サフィックスのみを残す)。すべてのサブディレクトリを巡回してglobを許可するには、**
二重星glob()が必要です。setopt -s globstar
答え2
現在のディレクトリとサブディレクトリのすべてのファイル名を次のように変更するには.foo.bar
:.bar
rename 's/\.foo\.bar/\.bar/' * */*
以下はrename
Perlパッケージの名前変更ユーティリティです。一部のシステムではと呼ばれることがありますprename
。
(残念ながら、rename
一部のシステムではパッケージから実行可能ファイルをインストールすることがありますutil-linux
。互換性がない.)