Linux: 이름을 바꾸는 동안 동일한 이름을 가진 다른 디렉터리의 파일을 하나로 이동

Linux: 이름을 바꾸는 동안 동일한 이름을 가진 다른 디렉터리의 파일을 하나로 이동

내 오래된 CD를 Track1.mp3로 일괄 리핑했습니다. 문제는 각 CD 디렉토리에 Track1.mp3이 있어서 /Music으로 옮기면 덮어쓰게 된다는 것입니다!

bash 스크립트나 mv 명령이 있을 수 있나요?이동하다동일한 파일 이름을 가진 여러 하위 디렉터리의 .mp3를 단일 디렉터리로 옮기고 해당 이름이 이미 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

예를 들어 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
  • 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'

관련 정보