ディレクトリ内の各ファイルからファイル名の一部を削除するBashスクリプト

ディレクトリ内の各ファイルからファイル名の一部を削除するBashスクリプト

ディレクトリに名前が 。形式のファイルが複数あります*.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/'  * */*

以下はrenamePerlパッケージの名前変更ユーティリティです。一部のシステムではと呼ばれることがありますprename

(残念ながら、rename一部のシステムではパッケージから実行可能ファイルをインストールすることがありますutil-linux互換性がない.)

関連情報