bash シェルで多数のファイルの名前を変更するにはどうすればいいですか?

bash シェルで多数のファイルの名前を変更するにはどうすればいいですか?

質問して申し訳ありません。インターネットでいろいろ検索しましたが、有効な答えは見つかりませんでした(提案はたくさんありましたが)。

そこで、たくさんのファイルの名前を変更したいのですが、すべてのファイル名を書き込むことはできません。ファイル名は次のようになります。

HAUPT_SIA_039.MR.NEUROPSYCHOLOGIE_LOGIN.0003.0001.2014.03.28.14.49.59.511530.47117493.IMA

先頭は常に同じで、.IMA の長い番号もすべてのファイルで同じではありません。すべてのファイルで 039 を 036_2 に変更する必要があります。残りは同じままです。

以下のコマンドをすべて(および他のいくつかのコマンドも)試しましたが、何も起こりませんでした。

cd my_directory

rename 's/\w039_2\w/\w036_2\w/g' * 

rename ?039_2? ?036_2? ?0_39_2?.IMA

rename 's/?039_2?/?036_2?/' ?039_2?.IMA

rename 's/\w039_2\w/\w036_2\w/' ?039_2?.IMA

Perl は Linux システムにインストールされています (ただし、Perl ターミナルを開いても何も起こらないため、呼び出す方法がわかりません)。

手伝ってもらえますか?

答え1

for file in * ; do mv $file $(echo $file | sed 's/_039/_036_2') ; done

説明:

for file in * ; do _______ ; done

bashはシェル展開を実行して、*作業ディレクトリ内のすべてのファイルをリストします。これらのファイルごとに、このコマンド構造は変数をfileファイル名と同じに設定し、その間のコマンドを実行します; do; done

mv $file _______

mvfileこれは、Unix/Linuxでファイル名を変更する伝統的な方法です。_______

echo $file | sed 's/_039/_036_2'

echo $file | sedは単に「file」を stdin に送信しsedsed「_036_2」を「_039」に置き換えます。

全体として、現在のディレクトリ内のすべてのファイルの名前を変更し、「_036_2」を「_039」に置き換えます。

答え2

あなたの正規表現はおかしくなっています。ここに機能する正規表現があります。

rename 's/HAUPT_SIA_039[.]\(.*\)/HAUPT_SIA_039_2.\1/g' HAUPT_SIA*.IMA

正しいツールを使用しています。サブディレクトリがない限り、検索する必要はありません。


sed および rename における正規表現に関する注意事項。

形式はsXsearch_patternXreplace_patternXoptions(X任意の文字を使用できます) です。searchPattern は置換対象であり、置換するものではなく、すでに存在するものを検索します。

-w単一の単語であり、search_pattern にのみ使用できます。

答え3

find . -name "*039*" | 's/039/036_2/g' に名前を変更

答え4

「HAUPT_...」プレフィックスを持つすべてのファイルをループし、シェルのサブストリングを使用して名前を変更すると${f:15}、プレフィックスに追加されたファイル名の 15 番目の文字からの文字列が返されますHAUPT_...

for f in "HAUPT_SIA_039*" ; do  mv $f "HAUPT_SIA_036_2${f:15}"; done

編集 - すべてのファイルを含むディレクトリには、同じ HAUPT... プレフィックスを持つサブディレクトリも含まれているようです。その場合は、find最初にディレクトリではなくファイルのみをフィルタリングするコマンドを使用します。

find . -type f -name "HAUPT_SIA_039*" | while read f; do mv $f "HAUPT_SIA_036_2${f:15}"; done

関連情報