데비안 컴퓨터에서 내 영화 폴더를 재구성하려고 시도한 후 결국 다음과 같은 구조를 갖게 되었습니다.
├── Universal.Love(2017)(1080p)
│ └── Universal.Love(2017)(1080p)
│ └── Universal.Love(2017)(1080p)
│ └── Universal.Love(2017)(1080p).mkv
│ └── Universal.Love(2017)(1080p).mkv.mkv
├── Unknown.User.2014.German.DTS.DL.1080p.BluRay.x264-EXQUiSiTE
│ └── exq-unknownuser-1080p
│ └── exq-unknownuser-1080p
│ └── exq-unknownuser-1080p
│ └── exq-unknownuser-1080p.mkv
├── Unsane.2018.1080p.BluRay.x264-DRONES
│ └── Unsane.2018.1080p.BluRay.x264-DRONES
│ └── Unsane.2018.1080p.BluRay.x264-DRONES
│ └── Unsane.2018.1080p.BluRay.x264-DRONES
│ └── Unsane.2018.1080p.BluRay.x264-DRONES.mkv
├── Untitled (2017)
│ └── Untitled.2017.WEBDL-1080p
│ └── Untitled.2017.WEBDL-1080p
│ └── Untitled.2017.WEBDL-1080p
│ └── Untitled.2017.WEBDL-1080p.mkv
하나의 하위 폴더에만 .mkv를 가질 수 있습니까?
답변1
shopt -s globstar nullglob
for dir in ./*/; do
for file in "$dir"/**/*.mkv; do
[ ! -f "$file" ] && continue
mv -i "$file" "$dir"
done
done
위의 이중 루프로 문제가 해결될 수 있습니다.
이는 현재 디렉터리(이러한 모든 최상위 디렉터리를 보유하는 디렉터리로 간주됨)의 디렉터리를 반복하여 수행됩니다. 각 디렉터리에 대해 .mkv
해당 디렉터리 아래의 모든 파일은 하위 디렉터리로 이동됩니다. 이는 하위 디렉터리가 재귀적으로 일치하는 **
globs를 통해 수행 됩니다.bash
쉘 활성화 globstar
옵션이 작동하며 **
, nullglob
주어진 패턴과 일치하는 항목이 없으면 루프가 전혀 실행되지 않습니다.
그런 다음 다음 명령을 사용하여 빈 디렉터리를 삭제할 수 있습니다.
find . -type d -empty -delete
답변2
이 시도,
find . -mindepth 3 -type f -name "*.mkv" -exec sh -c '
f="$1"; IFS=/ && set -- $f; echo mv -t "$2" "$f"
' find-sh {} \;
(첫 번째 하위 폴더를 찾는 방법:통과하다)
echo
출력 확인 시 삭제되었습니다.
이렇게 하면 구조에서 2레벨보다 깊은 모든 *.mkv 파일이 현재 디렉터리의 첫 번째 하위 디렉터리로 이동됩니다.
그런 다음 빈 디렉터리를 삭제할 수 있습니다.
find . -type d -empty -delete
답변3
이 시도,
find . -maxdepth 1 -type d ! -name '.' | while read -r folder; do
find $folder -type f -name '*.mkv' -exec mv {} $folder \;
find $folder -type d -empty -delete
done
- 첫 번째 항목은
find
모든 홈 디렉토리 목록을 가져옵니다. - 두 번째 단계에서는
find
사용 가능한 .mkv 파일을 홈 디렉터리로 이동합니다. - 세 번째 단계
find
에서는 홈 디렉터리의 모든 빈 디렉터리를 삭제합니다.
find
참고: 세 번째 항목을 루프 밖으로 이동하여 while
모든 빈 디렉터리를 한 번에 삭제할 수도 있습니다.