
古い CD を一括して Track1.mp3 にリッピングしました。問題は、各 CD ディレクトリに Track1.mp3 があるため、それを /Music に移動すると上書きされてしまうことです。
bashスクリプトまたはmvコマンドはありますか?動く同じファイル名を持つ複数のサブディレクトリから .mp3 を 1 つのディレクトリに移動し、その名前がすでに LINUX に存在する場合は名前を変更しますか?
答え1
おそらく「フレンドリーな」名前変更を望むでしょう。次のような構造があると仮定しましょう。
Artist1-+
+-AlbumA-+
| +-Track1.mp3
| +-Track2.mp3
+-AlbumB-+
+-Track1.mp3
+-Track2.mp3
Artist2-+
+-AlbumX-+
| +-Track1.mp3
| +-Track2.mp3
+-AlbumY-+
| +-Track1.mp3
| +-Track2.mp3
単一のディレクトリに次のような内容を含めるようにします。
Artist1-AlbumA-Track1.mp3
Artist1-AlbumA-Track2.mp3
...
Artist2-AlbumY-Track1.mp3
Artist2-AlbumY-Track2.mp3
bash
これは単純なループで実現できます
for M in */*/*.mp3; do
TRACK=$(basename "$M")
ALBUM=$(basename $(dirname "$M"))
ARTIST=$(basename $(dirname $(dirname "$M")))
mv "$M" "$TARGET_DIR/$ARTIST-$ALBUM-$TRACK"
done
答え2
およびコマンドはcp
、オプションmv
を通じてこの機能をサポートします--backup
。
からマニュアル:
--backup[=CONTROL] make a backup of each existing destination file -b like --backup but does not accept an argument
[...]
--suffix または SIMPLE_BACKUP_SUFFIX で設定されていない限り、バックアップ サフィックスは '~' です。バージョン管理方法は、--backup オプションまたは VERSION_CONTROL 環境変数を通じて選択できます。値は次のとおりです。
none, off never make backups (even if --backup is given) numbered, t make numbered backups existing, nil numbered if numbered backups exist, simple otherwise simple, never always make simple backups
つまり、eg はmv --backup=t <source_file> <dest_file>
動作するはずです。
答え3
Linux コミュニティと commandlinefu.com によると、この便利な機能は、これまでのどのバージョンでもまったく利用できないそうです。
現在、同じ名前を持つ複数のディレクトリとサブディレクトリからファイルを上書きせずに単一のディレクトリに移動するコマンドやコマンドライン経由の確実な方法はありません。
出典: commandlinefu.com、askubuntu.com、linuxquestions.org、superuser.com
答え4
次のようなフォルダ構造になっていると想定します。
$ tree .
.
├── artist1
│ ├── albuma
│ │ └── Track1.mp3
│ └── albumb
│ └── Track1.mp3
└── artist two
├── album one
│ └── Track1.mp3
└── album two
└── Track1.mp3
まず、cd
MP3 コレクションの親フォルダー ( の親フォルダーartist1
) に移動します。
次のfind
コマンドを実行すると、次のような出力が表示されます。
$ find . -name '*.mp3' -exec bash -c 'echo mv -v "$1" /tmp/music/$(echo "$1" | sed "s/\.\///" | tr " /" "-")' bash {} \;
mv -v ./artist two/album one/Track1.mp3 /tmp/music/artist-two-album-one-Track1.mp3
mv -v ./artist two/album two/Track1.mp3 /tmp/music/artist-two-album-two-Track1.mp3
mv -v ./artist1/albuma/Track1.mp3 /tmp/music/artist1-albuma-Track1.mp3
mv -v ./artist1/albumb/Track1.mp3 /tmp/music/artist1-albumb-Track1.mp3
find
MP3ファイルへのすべてのパスを収集し、./artist two/album one/Track1.mp3
それらを次のように渡しますbash
。-exec
$(echo "$1" | sed "s/\.\///" | tr " /" "-")
出力ファイル名を変更するために使用されます。sed
最初の を削除し./
、tr
すべてのスペース文字と/
を に変換します-
。
find
開始ディレクトリとして実行することが重要です.
。そうしないと、(相対)出力パスが正しく変更されません。/tmp/music/
音楽ライブラリのパスに変更します。
出力に問題がなければ、最初のものを削除してecho
コマンドを再度実行します。
出力:
$ find . -name '*.mp3' -exec bash -c 'mv -v "$1" /tmp/music/$(echo "$1" | sed "s/\.\///" | tr " /" "-")' babbsh {} \;
'./artist two/album one/Track1.mp3' -> '/tmp/music/artist-two-album-one-Track1.mp3'
'./artist two/album two/Track1.mp3' -> '/tmp/music/artist-two-album-two-Track1.mp3'
'./artist1/albuma/Track1.mp3' -> '/tmp/music/artist1-albuma-Track1.mp3'
'./artist1/albumb/Track1.mp3' -> '/tmp/music/artist1-albumb-Track1.mp3'