0

シェルコマンドで簡単に解決できる興味深い問題があります。ディレクトリ名が意味のあるディレクトリ ツリーがあり、各ディレクトリ内には .mp3 ファイルを含むいくつかのファイルがあります。

ディレクトリの名前と一致するように、すべての mp3 ファイルの名前をバッチで変更したいと思います。

たとえば、高レベルのディレクトリは次のようになります。

Seans-iMac% ls
2006.James Lovelock: Gaia’s Revenge
2006.Religion and stem cell research
2006.Stephen Schneider
2006.Tony Judt: Post-war Europe since 1945
2006.Water management
2007.'Here, Bullet'
2007.Alan Bennett

各サブディレクトリの内容は類似しています。

Seans-iMac% cd "2006.Religion and stem cell research"
Seans-iMac% ls
details.txt     lnl_20060605.mp3    synopsis.txt

これを次のように変更したいと思います。

Seans-iMac% ls
details.txt     2006.Religion and stem cell research.mp3    synopsis.txt

forループを試しましたが、パラメーターを正しく取得できないようです。さらに複雑にするために、ディレクトリ名にはスペースが含まれており、一部には単一引用符が含まれています。

4

3 に答える 3

3

各サブディレクトリに最大で 1 つの mp3 ファイルがあることが確実な場合は、次のようにします。

for i in *; do mv "$i"/*.mp3 "$i/$i.mp3"; done

スペースを扱う二重引用符に注意してください。

于 2013-03-11T13:58:28.277 に答える
2

シェルとしてtcshを使用しているという印象を受けています。私は大きな専門家ではないので、以下はbashシェルを生成し、bash構文を使用します。

bash -c 'find /path/to/root/dir -name \*.mp3 | while read file; do d=`dirname "$file"`; b=`basename "$d"`; echo mv -v "$file" "$d/$b.mp3";done'

これは変更を行わず、実行されるコマンドをエコーするだけです。再確認した後、実際に必要な処理が実行される場合echoは、コマンドの前にあるを削除しますmv

これには上記のものと同じ制限があります。ディレクトリに複数のmp3ファイルがある場合、最後の(アルファベット順の)ファイルにはdirectory.mp3の名前が付けられ、他のすべてのmp3ファイルは上書きされます(読み取り:失われます)。 。

この場合の違いは、フォルダーの構造をネストできることであり、必ずしも1つのレベルにあるとは限りません。

于 2013-03-11T15:18:37.863 に答える
2
for d in 2???.*
do
    mv "$d"/*.mp3 "$d/$d.mp3"
done

glob パターンは、関心のあるディレクトリ名を生成し、名前のスペースを保持します。このmvコマンドは、サブディレクトリにファイルが 1 つしかないことを前提としている.mp3ため、最初の引数は正しいファイル名に展開され (スペースは再び保持されます)、2 番目の引数は目的の形式になります。*.mp3は二重引用符で囲まれた文字列の外側にあることに注意してください。これにより、ファイル名の拡張が可能になります。ディレクトリ名 (空白が含まれる場合があります) は、空白が失われないように常に二重引用符で囲まれていることに注意してください。

グロブ以外のメカニズムを使用してディレクトリ名を生成する場合は注意してください。使えないわけではありません。それだけのケアが必要です。改行を含むディレクトリ名は、スペースよりもさらに問題になる傾向があることに注意してください。そのようなディレクトリの名前を変更して、改行が含まれないようにします(改行を含むファイル名にも同じことが当てはまります)。名前の先頭と末尾の空白も問題になる可能性があります。

于 2013-03-11T13:58:41.833 に答える