サブフォルダのファイル名の一括変更、プレフィックスの削除

サブフォルダのファイル名の一括変更、プレフィックスの削除

任意のサブディレクトリに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'

関連情報