質問: 名前の一部を変更せずに、ディレクトリ内のファイルの名前を変更するにはどうすればよいですか? 私はそのように名付けられた複数のファイル(約1000)を持っています:abcdefg123456.xyz abcdefg123457.xyz abcdefg123458.xyz abcdefg123459.xyz 一部のファイルには、名前の後に4つの追加の乱数と文字(任意の順序)があります。これらは重複している可能性がありますが、常にではないため、元の形式に変更して、重複しているかどうかを確認する必要があります。彼らはこのフォーマットを持っています:abcdefg123456a789.xyz abcdefg123457b987.xyz abcdefg123458c879.xyz abcdefg123459d897.xyz 場合によっては、間違った拡張子もありますが、abcdefg123456.xyzedf abcdefg123456.xyzfed これらのファイルの名前をabcdefgの元の形式に変更し、その後に元の6つの数字を続けます。つまり、末尾の4つの乱数と文字を削除し、末尾の拡張子を.xyzに戻します。これまでのところ、次のようになっています。rename -n "s/[a-z][0-9]{6}.xyz/.xyz/g" * しかし、それはうまくいかないようです。何らかの理由で、出力は次のようになります。abcdef.xyz (no numbers) 編集:どちらも解決策を見つけるのに役立ったので、私はどちらの答えから選択するかの間で少し引き裂かれました。彼が質問の2番目の部分も手伝ってくれたので、私はスタッツに行きました。しかし、あなたの助けもマーク・ペリーマンに大いに感謝しています-そしてもちろんコメンターも。
回答: 試してみてください_rename -n -f 's/([a-z]*[0-9]{6})[a-z0-9]{0,4}(\.xyz).*/$1$2/g' * _これは、debianとubuntuでリリースされたバージョンのrenameで機能します( http://www.computerhope.com/unix/rename.htm のmanページを参照)これにより、名前が重複するファイルが上書きされます。これが機能する理由 _([a-z]*[0-9]{6})_はキャプチャされたabcdefg123456であり、置換では_$1_と呼ぶことができます。 _(\.xyz)_はキャプチャされた拡張子であり、置換では_$2_と呼ばれます。 他のすべての_[a-z0-9]{0,4}_(最大4文字/数字)と_.*_(拡張子の後のすべて)が一致し、置換では無視されます。 ボーナスパターンにまだ適合しないすべてのファイルを削除するには(たとえば、上記の強制オプションを使用しなかった場合)、findを使用してそれらをリストします。それらを削除します。 (ドライランの場合は_-exec rm {}_なしで実行します。)_find . -regextype posix-egrep -regex '.*/[a-z]*[0-9]{6}[a-z0-9]{4}\.xyz.*|[a-z]*[0-9]{6}\.xyz.*' -exec rm {} _