![bash シェルで多数のファイルの名前を変更するにはどうすればいいですか?](https://rvso.com/image/1416382/bash%20%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%A7%E5%A4%9A%E6%95%B0%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%90%8D%E5%89%8D%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%81%84%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
質問して申し訳ありません。インターネットでいろいろ検索しましたが、有効な答えは見つかりませんでした(提案はたくさんありましたが)。
そこで、たくさんのファイルの名前を変更したいのですが、すべてのファイル名を書き込むことはできません。ファイル名は次のようになります。
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 _______
mv
file
これは、Unix/Linuxでファイル名を変更する伝統的な方法です。_______
echo $file | sed 's/_039/_036_2'
echo $file | sed
は単に「file
」を stdin に送信しsed
、sed
「_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