파일 형식을 이동하고 하위 폴더가 있는 경우 하위 폴더를 생성하는 스크립트가 있습니까?

파일 형식을 이동하고 하위 폴더가 있는 경우 하위 폴더를 생성하는 스크립트가 있습니까?

기본적으로 디렉터리를 계속해서 검색하는 스크립트를 찾으려고 하는데, 스크립트가 파일을 찾으면 .flac동일한 폴더에 FLAC라는 하위 폴더를 만들고 .flac파일을 해당 디렉터리로만 이동합니다. 동일한 디렉토리에서 30개의 flac 파일을 찾을 수 있으므로 폴더가 이미 존재한다는 사실을 깨닫고 충돌이 발생하는 것을 원하지 않습니다.

폴더/파일 레이아웃 예:

  • 기본 경로는

    /files/music
    
  • 현재 하위 디렉토리는 다음과 같습니다.

    /files/music/artist
    /files/music/artist/album1
    /files/music/artist/album2
    
  • 파일은 다음과 같이 나타납니다.

    /files/music/artist/album1/01-song 1.mp3
    /files/music/artist/album1/01-song 1.flac
    /files/music/artist/album1/02-another song.mp3
    /files/music/artist/album1/02-another song.flac
    /files/music/artist/album2/01-yet another.mp3
    /files/music/artist/album2/01-yet another.flac
    
  • 그래서 본질적으로 나는 그것이 다음과 같이 되기를 원합니다:

    /files/music/artist/album1/01-song1.mp3
    /files/music/artist/album1/02-another song.mp3
    /files/music/artist/album1/flac/01-song 1.flac
    /files/music/artist/album1/flac/02-another song.flac
    /files/music/artist/album2/01-yet another.mp3
    /files/music/artist/album2/flac/01-yet another.flac
    

전체적인 아이디어는 많은 CD를 스캔한 후 혼합 버전이 포함된 폴더가 많이 있다는 것입니다. 따라서 미디어 플레이어는 결국 노래를 두 번 재생하게 됩니다(먼저 mp3 버전, 그 다음 flac 버전). .

mp3 파일이 존재하지 않는 경우 디렉토리를 그대로 두는 스크립트를 작성할 수 있습니까? (flac만?) 따라서 폴더에 .flac 파일만 있으면 하위 폴더가 생성되지 않고 그대로 유지됩니다. 내가 보는 유일한 문제는 폴더에 다른 파일(jpg 표지 파일 등...)이 있을 수 있기 때문에 mp3 파일을 찾아야 한다는 것입니다.

답변1

간단한 버전에서는 항상 flac하위 디렉터리를 생성하고 mp3(비어 있지 않은 경우) find필요한 경우 명령을 사용하여 하위 디렉터리를 생성하고 거기로 파일을 이동하는 스크립트를 실행합니다.

find . -name '*.mp3' -o -name '*.flac' -exec sh -c 'mkdir -p "${0%/*}/${0##*.}" && mv "$0" "${0%/*}/${0##*.}"' {} \;

셸 코드 조각을 실행하는 각 파일에 대해 는 $0파일 경로, ${0%/*}는 디렉터리 부분, ${0##*.}확장자는 입니다.

set -o globstar또는 bash(또는 대체가 있는 ksh93 또는 대체가 shopt -s globstar extglob없는 zsh ) 에서 다음을 사용합니다.setopt ksh_glob**무늬:

shopt -s globstar extglob
for x in **/*.@(mp3|flac); do
  mkdir -p "${x%/*}/${x##*.}" && mv "$x" "${x%/*}/${x##*.}"
done

이제 모든 파일의 확장자가 동일한 경우 하위 디렉터리를 생성하지 않는 버전을 만들어 보겠습니다. 여기서는 디렉토리를 반복하는 것이 더 쉬울 것입니다. 이는 bash용입니다(ksh93 또는 zsh에 적용 가능). 각 디렉터리에서 스크립트는 모든 파일 목록을 수집합니다( 위의 ..flac ..), all.mp3 files and allflac` files in arrays. If there is at least one flac file and at least one non-flac files, move the flac files to a하위 디렉터리 제외. mp3 파일).

shopt -s globstar nullglob; GLOBIGNORE=.:..
start_wd=$PWD
for dir in "$PWD"/**/*/; do
  cd "$dir"
  files=(*)
  flac_files=(*.flac)
  mp3_files=(*.mp3)
  if ((${#flac_files[@]} > 0 && ${#flac_files[@]} < ${#files[@]})); then
    mkdir flac && mv "${flac_files[@]}" flac/
  fi
  if ((${#mp3_files[@]} > 0 && ${#mp3_files[@]} < ${#files[@]})); then
    mkdir mp3 && mv "${mp3_files[@]}" mp3/
  fi
done
cd "$start_wd"

답변2

이것을 사용하십시오 :

#!/bin/bash

find /files/music/artist -type f -name '*.flac' | while IFS= read -r file; do
    dir="$(dirname "$file")"
    file="$(basename "$file")"
    shopt -s nullglob
    mp3s=( "$dir"/*.mp3 )

    if ! [[ ${#mp3s[@]} -eq 0 ]]; then
        ext="${file##*.}"
        mkdir -p "$dir/$ext" && mv -i "$dir/$file" "$dir/$ext"
    fi
done
  • find.flac확장자를 가진 파일은 언급된 디렉터리와 모든 하위 디렉터리에서 찾을 수 있습니다.

  • dir파일의 디렉토리 이름을 포함하고 file파일 이름을 갖습니다.

  • 그런 다음 디렉터리에 파일이 있는지 확인하고 .mp3, 그렇지 않은 경우 파일은 디렉터리에 남아 있습니다.

  • 해당 디렉터리에 파일이 있으면 .mp3확장자( )를 가진 디렉터리가 생성되고 해당 디렉터리로 파일이 이동됩니다.flac.flac

답변3

요구 사항은 약간 복잡하지만 이 스크립트가 도움이 될 수 있습니다.

#!/bin/bash

run() {
        if $DRYRUN; then
                echo -n +
                printf " '%s'" "$@"
                echo
        else
                "$@"
        fi
}

DRYRUN=false
if test x"$1" = x-d; then
        DRYRUN=true
        shift
fi

for dir in "$@"; do 
        find "$dir" -type d |
        while read subdir; do
                if ls "$subdir"/*.flac >/dev/null 2>&1; then
                        if ls "$subdir"/*.mp3 >/dev/null 2>&1; then
                                run mkdir -p "$subdir"/flac
                                run mv "$subdir"/*.flac "$subdir"/flac
                        fi
                fi
        done
done

를 지정하면 어떤 일이 발생하는지 확인할 수 있습니다 -d. 실제로 이사하기 전에 꼭 다시 한 번 확인해보세요.

$ ./script.sh -d /files/music
+ 'mkdir' '-p' '/files/music/artist/album2/flac'
+ 'mv' '/files/music/artist/album2/01-yet another.flac' '/files/music/artist/album2/flac'
+ 'mkdir' '-p' '/files/music/artist/album1/flac'
+ 'mv' '/files/music/artist/album1/01-song 1.flac' '/files/music/artist/album1/02-another song.flac' '/files/music/artist/album1/flac'

관련 정보