Linux: 同じ名前の異なるディレクトリのファイルを名前を変更しながら 1 つのディレクトリに移動する

Linux: 同じ名前の異なるディレクトリのファイルを名前を変更しながら 1 つのディレクトリに移動する

古い 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

まず、cdMP3 コレクションの親フォルダー ( の親フォルダー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
  • findMP3ファイルへのすべてのパスを収集し、./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'

関連情報