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