最後の下線の後の文字列を削除した後、sedコマンドを使用して複数のファイルの名前を変更します。 [閉じる]

最後の下線の後の文字列を削除した後、sedコマンドを使用して複数のファイルの名前を変更します。 [閉じる]

以下のように、ディレクトリにファイルセットがあり、最後のアンダースコアが表示された後に文字列を削除したいと思います。文字列は毎回異なる場合があります。それでそうすることができれば本当に良いと思いますsed

入力ファイル:

com_101_00000_0001_a234.txt
com_101_retail_00000_0002_g345.ctl
com_101_lines_003_0002_1134.txt

結果ファイル名:

com_101_00000_0001.txt
com_101_retail_00000_0002.ctl
com_101_lines_00003_0002.txt

答え1

システムにperlがある場合は、rename次のことができます。

rename -n 's/_[^_]+?\././' *

ファイルが同じ名前で終わる可能性がある場合は、上書きしない場合は次のようにします-i

rename -in 's/_[^_]+?\././' *

期待した内容であれば、削除し-nて実際にファイル名を変更してください。

本当に靴のへらにこだわったら、sed次のように不必要に複雑なことができます。

for f in *_*.*; do
    new=$(printf "%s\n" "$f" | sed 's/\(.*\)_[^_]*\(\.[^_]*\)$/\1\2/')
    echo mv "$f" "$new"
done

またはそうでない場合は、sedより賢明に:

for f in *_*.*; do echo mv "$f" "${f%_*}.${f##*.}" ; done

最後の2つの例では、予想と一致する場合は削除してecho実際にファイル名を変更してください。

関連情報