次の名前の別のフォルダにあるファイルの一覧があります。
aaaaaa_bb_cccc_ddddd_ee.jpg
その一部では、2番目の前にすべてを削除する必要があります。
cccc_ddddd_ee.jpg
他の場合は(すでに別のフォルダにあります)、3番目のフォルダより前のすべてのアイテムを削除する必要があります_
ddddd_ee.jpg
いくつかの正規表現を使用する rename のようなコマンドについて知っていますが、この場合の正確な表現はわかりません。 Linux端末でこれをどのように実行できますか?
答え1
Perlの名前変更ユーティリティを使用して
$ ls
aaaaaa_bb_cccc_ddddd_ee.jpg
$ rename -n 's/([^_]*_){2}//' *
rename(aaaaaa_bb_cccc_ddddd_ee.jpg, cccc_ddddd_ee.jpg)
$ rename -n 's/([^_]*_){3}//' *
rename(aaaaaa_bb_cccc_ddddd_ee.jpg, ddddd_ee.jpg)
この-n
フラグは、Renameに実行するアクションを出力するように指示します。削除すると、編集-n
内容が適用されます。
*
現在のディレクトリ内のすべてのファイルに展開されます。上記の例ではファイルは1つしかありませんが、名前変更は1回の実行で複数のファイルに対して操作を実行できます。この場合は*
シェルループよりも高速です。
s/([^_]*_){2}//
意味: ファイル名のs
すべての正規表現を何もないものに置き換えます。([^_]*_){2}
正規表現は、アンダースコアではなく任意の数[^_]*
と_
アンダースコアが2回繰り返されることを意味します。
答え2
2番目まですべて削除_
rename -n 's/[^_]*[_][^_]*[_]//' *
3番目の前にすべてを削除してください_
rename -n 's/[^_]*[_][^_]*[_][^_]*[_]//' *
効果的に削除すると、-n
テストだけでなくファイル名も変更されます。