내 컴퓨터 중 하나에서 일부 파일 복제에 문제가 있습니다. 상위 폴더에 이름이 같은 모든 폴더의 복사본이 있는데, 공간이 많이 낭비되고 있어서 모두 삭제하고 싶습니다.
예:
/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
여전히 지원되는 일부 구현이 있음 ):-mindepth
find
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
옵션을 사용하면 최상위 디렉터리가 .
시작 검색 경로로 사용되므로 삭제되지 않습니다.
관련된: