次のような名前のファイルセットがあります。
Friends - 6x03 - Tow Ross' Denial.srt
Friends - 6x20 - Tow Mac and C.H.E.E.S.E..srt
Friends - 6x05 - Tow Joey's Porshe.srt
次のように名前を変更したい
S06E03.srt
S06E20.srt
S06E05.srt
linuxターミナルでジョブを実行するにはどうすればよいですか? renameをインストールしましたが、次を使用してエラーが発生します。
rename -n 's/(\w+) - (\d{1})x(\d{2})*$/S0$2E$3\.srt/' *.srt
アスタリスクの前のドットを忘れました:
rename -n 's/(\w+) - (\d{1})x(\d{2}).*$/S0$2E$3\.srt/' *.srt
OpenSUSE、RedHat、Gentooでは、rename
のPerlバージョンを使用する必要があります。 この回答 は、取得方法を示しています。 Archでは、パッケージの名前はPerl-rename
。
本当にクールなリルディディ。検索+ Perl + xargs + mv
xargs -n2
を使用すると、1行に2つの引数を出力できます。 Perlのprint $_
(最初に$ STDINを出力するため)と組み合わせると、強力な名前変更ツールになります。
find . -type f | Perl -pe 'print $_; s/input/output/' | xargs -n2 mv
Perl -pe 'print $_; s/OldName/NewName/' | xargs -n2
の結果は次のようになります。
OldName.ext NewName.ext
OldName.ext NewName.ext
OldName.ext NewName.ext
OldName.ext NewName.ext
私のシステムでは、Perlのrename
をすぐに利用できませんでした。
どのように機能しますか?
find . -type f
はファイルパス(またはファイル名...ここで正規表現によって処理されるものを制御します!)を出力します。-p
は正規表現によって処理されたファイルパスを出力し、-e
はインラインスクリプトを実行しますprint $_
は最初に元のファイル名を出力します(-p
とは無関係)-n2
は1行に2つの要素を出力しますmv
は前の行の入力を取得しますEdit:IFS
とls
は、sh
に準拠したままです。
そのためにシェルスクリプトを実行します。
#!/bin/sh
for file in *.srt; do
if [ -e "$file" ]; then
newname=`echo "$file" | sed 's/^.*\([0-9]\+\)x\([0-9]\+\).*$/S0\1E\2.srt/'`
mv "$file" "$newname"
fi
done
前のスクリプト:
#!/bin/sh
IFS='
'
for file in `ls -1 *.srt`; do
newname=`echo "$file" | sed 's/^.*\([0-9]\+\)x\([0-9]\+\).*$/S0\1E\2.srt/'`
mv "$file" "$newname"
done
すべてのディストリビューションが、上記の例で使用されている正規表現をサポートするrename
ユーティリティ(RedHat、Gentoo、およびそれらの派生物など)を出荷しているわけではありません。
使用しようとする代替手段はPerl-rename
およびmmv
。
シンプルですが便利です。任意の文字列に*
を使用し、一致文字列の任意の文字に?
を使用し、置換文字列に#X
を使用してX番目の一致を参照します。
あなたの場合:
mmv 'Friends - 6x?? - Tow *.srt' 'S06E#1#2.srt'
ここで、#1#2
は、??
(#1と#2に一致)によってキャプチャされる2桁を表します。
したがって、次の置換が行われます。
Friends - 6x?? - Tow * .srt matches
Friends - 6x03 - Tow Ross' Denial.srt which is replaced by
↓↓
S06E03.srt
mmv
は、[
および]
および;
によるマッチングも提供します。
renameだけでなく、move、copy、appendおよびlinkファイル。
詳細については、上記のリンクのmanページをご覧ください!
個人的には、番号をパディングするために使用し、辞書式にソートされたときに番号付きファイルが希望の順序で表示されるようにします:file_?.ext
→file_0#1.ext
linuxがrenameを提供しない場合は、次も使用できます。
find . -type f -name "Friends*" -execdir bash -c 'mv "$1" "${1/\w+\s*-\s*(\d)x(\d+).*$/S0\1E\2.srt}"' _ {} \;
私はこのスニペットを頻繁に使用して、コンソールで正規表現で置換を実行します。
私はシェルのものはあまり得意ではありませんが、このコードを理解している限り、その説明は次のようになります:findの検索結果はbashに渡されます-command(bash -c)ここで、検索結果はソースファイルとして$ 1内にあります。後続のターゲットは、サブシェル内の置換の結果です。ここで、$ 1のコンテンツ(ここでは、ちょうど1パラメーター置換{1 // find/replace})も検索結果になります。 {}は-execdirのコンテンツに渡します
より良い説明をたくさんいただければ幸いです:)
注:正規表現のみをコピーアンドペーストしました。最初にサンプルファイルでテストしてください。システムによっては、\ dと\ wを[[:digit:]]や[[:alpha:]]などの文字クラスに変更する必要がある場合があります。ただし、グループでは\ 1が機能するはずです。