アンダースコアの前のすべての文字を保持しながら、ファイル名を繰り返し変更します。

アンダースコアの前のすべての文字を保持しながら、ファイル名を繰り返し変更します。

CentOS 7システムでは、何千ものファイル名を繰り返し変更する必要があります。現在の形式は次のとおりです。

(32-64 alphanumerics)_various special characters.wav

つまり、3レベルの深さのすべてのファイルから拡張子を繰り返し削除したいと思います_(注:すべての拡張子は次のようになります)。.wav.wav

例: 既存:

/home/user/recordings/TEST/december/157A757989F047C3AC2EC3499B4D04A5_7075276189 by [email protected] @ 8_44_52 AM.wav

/home/user/recordings/test/october/28D1E1840DE24D9DB4CF6D1A707533F6337C2DDE_2018690759 by [email protected] @ 1_26_55 PM.wav

期待する:

/home/user/recordings/TEST/december/157A757989F047C3AC2EC3499B4D04A5.wav

/home/user/recordings/test/october/28D1E1840DE24D9DB4CF6D1A707533F6337C2DDE.wav

私はたくさんの検索をし、ファイル名の他の部分を修正する多くの方法を見つけましたが、特定の文字(_)と拡張子の前のすべての内容を保持しませんでした。

助けてくれてありがとう。

答え1

ディレクトリ部分、ファイル名、および前の文字を抽出する必要があります。最初アンダースコア(すべてのファイル.wavに対して別々の変数に拡張子を格納する必要はないため):

find /home/scott/ -maxdepth 4 -type f -name '*_*.wav' -exec sh -c 'h=${1%/*}
t=${1##*/}; echo mv "$1" "${h}/${t%%_*}".wav' doom {} \;

echo実際にファイル名を変更するには削除してください。

答え2

私はたくさんの検索をし、ファイル名の他の部分を修正する多くの方法を見つけましたが、特定の文字(_)と拡張子の前のすべての内容を保持しませんでした。

これはsedトリックを行うようです sed -E 's/(.*)_[0-9].* by .*(\.wav)/\1\2/'

echo "/home/user/recordings/TEST/december/157A757989F047C3AC2EC3499B4D04A5_7075276189 by [email protected] @ 8_44_52 AM.wav" | sed -E 's/(.*)_[0-9].* by .*(\.wav)/\1\2/'
/home/user/recordings/TEST/december/157A757989F047C3AC2EC3499B4D04A5.wav

別のサンプル文字列でテストします。

echo "/home/user/recordings/test/october/28D1E1840DE24D9DB4CF6D1A707533F6337C2DDE_2018690759 by [email protected] @ 1_26_55 PM.wav" | sed -E 's/(.*)_[0-9].* by .*(\.wav)/\1\2/'
/home/user/recordings/test/october/28D1E1840DE24D9DB4CF6D1A707533F6337C2DDE.wav

使用中にsed式の一部を保存し()てから再挿入できます\1\2

答え3

prenameたとえば、(Perl の名前変更) 実装をインストールします。File::RenameまたはUnicode::Tussle。 (最後に見ると、CentOSにはPerlの名前変更機能がなく、util-linuxだけではrename必要な操作はできませんが、CentOS 7では変更されている可能性があります。)含まれています。 Perlコードと命名されました。prename CODE FILENAME...CODE

find /home/user/recordings/ -type f -exec prename 's!_[^/]*(\.[^./]*)$!$1!' {} +

Perlの説明:(\.[^./]*)$名前の末尾の拡張子と一致します。_[^/]*最初のアンダースコア(スラッシュなし)で始まるディレクトリ部分を除いて、ファイル名のすべてと一致します。$ブラケットグループの最初で唯一の部品に置き換えられました。

関連情報