폴더 구조가 혼란스럽습니다. 하나를 제외한 빈 하위 폴더를 삭제하는 방법이 있습니까?

폴더 구조가 혼란스럽습니다. 하나를 제외한 빈 하위 폴더를 삭제하는 방법이 있습니까?

데비안 컴퓨터에서 내 영화 폴더를 재구성하려고 시도한 후 결국 다음과 같은 구조를 갖게 되었습니다.

├── 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모든 빈 디렉터리를 한 번에 삭제할 수도 있습니다.

관련 정보