任意のサブディレクトリにMP4ファイルがたくさんあります。削除する必要がある任意のプレフィックスがあります。このフォルダ構造の例は次のとおりです。
/
../AFolder/Afolder2/123-01-filename.mp4
../BFolder/Bfolder2/512-01-filname.mp4
../CFolder/Cfolder2/881-01-filename.mp4
デフォルトでは、各ファイル名の前の3桁の数字とダッシュを削除したいので、最終ファイルは次のようになります。
/
../AFolder/Afolder2/01-filename.mp4
../BFolder/Bfolder2/01-filname.mp4
../CFolder/Cfolder2/01-filename.mp4
私はこれを使ってこれをやろうとしています。
for file in ./*/*/*mp4
do
changeto="(echo $name | cut -c4-)"
echo $name $changeto
#mv #name $changeto
done
ただし、これにより、最終ファイルだけでなく、すべてのディレクトリ+ファイルの最初の4つが切り捨てられます。
答え1
シェルループの使用に関するアドバイスに従ってください。
for name in ./*/*/???-*.mp4; do
filename=${name##*/} # remove directory path
filename=${filename#???-} # remove initial three characters and dash
# prepend directory path to target filename and rename
mv "$name" "${name%/*}/$filename"
done
これにより、変更したい名前が繰り返されます。各パス名に対してfilename
標準変数置換を使用して、パス名のファイル名部分を変数として抽出します。値から最初の3文字とダッシュを削除します。その後、この新しい値を使用して元のファイルの名前を変更できます$filename
。
ファイル名をより厳密に一致させる必要がある場合は、最初の3文字が数字であることを確認し、上記のパターンの?
各文字をまたはに[0-9]
変更してください[[:digit:]]
。
Perlユーティリティの使用rename
:
rename -v 's/...-([^\/]*\.mp4)$/$1/' ./*/*/???-*.mp4
これにより、指定された各ファイル名にPerl置換が適用されます。置換はファイル名と一致しますが、最後に保持したい名前のビットのみをキャプチャします(最後の文字列には、/
削除したい3文字とダッシュの前にある文字は含まれていません)。パス名の一致部分がキャプチャされた文字列に置き換えられます。
答え2
私は使用するのが好きミリメートル波、こんなことのためです。ファイルを移動するときにワイルドカード文字?と*を使用できます。各ワイルドカード文字を正規表現キャプチャグループとして扱いますが、これは私が考えたものです。
問題のデモは次のとおりです。
$ ls *Folder/*folder2/*
AFolder/Afolder2/123-01-filename.mp4 CFolder/Cfolder2/881-01-filename.mp4 BFolder/Bfolder2/512-01-filname.mp4
$ mmv "*Folder/*folder2/???-*" "#1Folder/#2folder2/#6"
$ ls *Folder/*folder2/*
AFolder/Afolder2/01-filename.mp4 CFolder/Cfolder2/01-filename.mp4 BFolder/Bfolder2/01-filname.mp4
難しい部分は、シェル自体からワイルドカードを呼び出すのを避けるために、最初の文字列を常に引用符で囲む必要があることです。第二に、それぞれを覚えていますか?独自のグループなので、ファイル名#6の残りの部分を取得する方法です。
答え3
以下を使用してシェルを見つけて呼び出すことができます。-exec
find . -type f -exec sh -c '
for f; do
d=${f##*/} d=${d#*[0-9][0-9][0-9]-}
echo mv -v "$f" "${f%'/'*}/$d"
done
' _ {} +
- echoはどのように/何をすべきかを教えてくれます。 ouptuが大丈夫だと思われる場合は削除してください。
実際の出力はこんな感じです。
出力
renamed './AFolder/Afolder2/123-01-filename.mp4' -> './AFolder/Afolder2/01-filename.mp4'
renamed './BFolder/Bfolder2/512-01-filename.mp4' -> './BFolder/Bfolder2/01-filename.mp4'
renamed './CFolder/Cfolder2/881-01-filename.mp4' -> './CFolder/Cfolder2/01-filename.mp4'