bash의 상위 폴더와 이름이 같은 폴더를 반복적으로 삭제하시겠습니까?

bash의 상위 폴더와 이름이 같은 폴더를 반복적으로 삭제하시겠습니까?

내 컴퓨터 중 하나에서 일부 파일 복제에 문제가 있습니다. 상위 폴더에 이름이 같은 모든 폴더의 복사본이 있는데, 공간이 많이 낭비되고 있어서 모두 삭제하고 싶습니다.

예:

 /mnt/test/files/foo
 \_ /mnt/test/files/foo/file1 (etc)
 |__ /mnt/test/files/foo/foo
 \_ /mnt/test/files/foo/foo/file1 (etc)
 |_ /mnt/files/foo/foo2
  \_ /mnt/files/foo/foo2/file1 (etc)
 |_ /mnt/files/foo/foo2/foo2
  \_ /mnt/files/foo/foo2/foo2/file1 (etc)

/mnt/files/foo/foo분명히 나는 ​​그것 과 그 /mnt/files/foo/foo2/foo2내용(등)을 완전히 제거하고 공간 낭비를 멈추고 싶습니다 . Bash에서 스크립트를 작성하는 좋은 방법은 무엇입니까?

답변1

find조건자를 지원하는 경우 다음을 -regex사용하여 디렉터리를 나열할 수 있습니다.

find . -type d -regex '.*/\([^/]*\)/\1' -prune -print

이를 제거하려면 다음과 같이 변경할 수 있습니다 -print.

-exec rm -rf {} +

하지만 필요한 파일을 삭제하지 않도록 먼저 목록을 확인하세요.

답변2

비 GNU 사용 (그러나 BSD 시스템 등에서 find여전히 지원되는 일부 구현이 있음 ):-mindepthfind

find top-dir -depth -mindepth 1 -type d -exec sh -c '
    for pathname do
        subdir=$pathname/${pathname##*/}
        if [ -d "$subdir" ]; then
            printf "Would remove directory %s\n" "$subdir"
            # rm -rfi "$subdir"
        fi
    done' sh {} +

그러면 루트부터 시작하여 디렉터리 계층 구조의 깊이 우선 순회가 수행됩니다 top-dir. 배치에서 발견된 디렉토리 경로 이름의 경우 짧은 쉘 스크립트가 호출됩니다. 짧은 쉘 스크립트의 루프가 반복될 때마다 $pathname디렉토리 자체와 이름이 동일한 디렉토리 내의 하위 디렉토리 경로 이름이 구성됩니다. 이 하위 디렉토리가 존재하는 경우 보고됩니다(제거는 현재 안전상의 이유로 주석 처리되어 있습니다).

-depth옵션을 사용하면 깊이 우선 순회가 발생합니다. 이것은 일반적으로 디렉토리를 삭제하기 위해 as를 사용할 때 원하는 것입니다. find그렇지 않으면 find삭제된 디렉토리에 들어가려고 할 수도 있습니다.

-mindepth 1옵션을 사용하면 최상위 디렉터리가 .시작 검색 경로로 사용되므로 삭제되지 않습니다.

관련된:

관련 정보