기본적으로 디렉터리를 계속해서 검색하는 스크립트를 찾으려고 하는데, 스크립트가 파일을 찾으면 .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 all
flac` 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'