수백 개의 하위 디렉터리가 있는 두 개의 디렉터리가 있습니다 dir1
. 나는 단지 공유되는 하위 디렉토리 이름에 대한 정보가 필요하고 그 이름을 체계적으로 제거해야 합니다 . 파일이나 파일 내용을 비교할 필요가 없습니다. 성능dir2
depth 1
dir1
dir2
dir2
diff -qr dir_one dir_two | sort
또한 현재는 관심이 없는 파일 이름도 생성합니다.
답변1
귀하의 사용 사례에 따라 피할 수 있습니다확인하다공개 디렉토리는 rm -rf
존재하지 않는 디렉토리는 무시되기 때문입니다.
그럼 그걸로 충분해find
모두디렉토리 dir1
에서 삭제하십시오 dir2
.
find dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%f\0" |xargs -0 rm -rf --
몇 가지 설명. 기본적으로 find
모든 디렉토리는 전체 경로와 함께 인쇄됩니다 dir1
. 따라서 -printf
제거하려는 선행 디렉토리(%f)와 추가 경로 "dir2" 없이 파일 이름만 인쇄합니다. 또한 xarg
옵션을 사용하기 위해 문자열을 종료하기 위해 개행 대신 널 바이트 "\0"을 사용합니다. -0
이는 공백이 있는 파일 이름에 대해 이 모든 것을 안전하게 만듭니다. 그런 다음 표준 입력을 xargs
읽고 rm
모든 문자열을 인수로 추가하여 명령을 실행합니다.
echo
실제로 삭제하기 전에 인쇄 전용 명령을 추가하여 명령줄을 테스트할 수 있습니다 rm
.
find dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%f\0" |xargs -0 echo rm -rf --
오직목록ls
대신 일반 디렉토리를 사용할 수 있습니다 rm
(존재하지 않는 디렉토리를 무시하려면 2>/dev/null 추가).
find dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%f\0" |xargs -0 -r ls -d -- 2>/dev/null
답변2
comm -1 -3 <( cd dir1 && find -maxdepth 1 -type d | sort ) <( cd dir2 && find -maxdepth 1 -type d | sort ) | ( cd dir2 && xargs rm -rf )
가독성을 위해 개행 문자를 사용하세요.
comm -1 -3 <( cd dir1 && find -maxdepth 1 -type d | sort ) \
<( cd dir2 && find -maxdepth 1 -type d | sort ) \
| ( cd dir2 && xargs rm -rf )
설명하다
find -maxdepth 1 -type d
하위 디렉터리 없이 디렉터리만 나열합니다.
cd dir1 && find -maxdepth 1 -type d | sort
먼저 디렉토리를 변경한 다음 디렉토리를 나열하십시오.
<( ... )
comm -1 -3 <( ... ) <( ... )
첫 번째 입력과 두 번째 입력을 가져오고 두 번째 입력에 고유한 줄을 인쇄합니다. 효과적으로, 이것은 dir2
위치는 있지만 에 없는 디렉토리를 인쇄합니다 dir1
.
... | ( cd dir2 && xargs rm -rf )
작업 디렉터리를 변경하고 dir2
이전 명령의 출력을 인수로 사용하여 실행합니다. 효과적으로, 이것은 위치는 있지만 에 없는 디렉토리를 rm -rf
삭제합니다 .dir2
dir1
먼저 파이프를 제거 하고 출력을 확인하여 xargs
테스트합니다 .
답변3
find dir1 dir2 -maxdepth 2 | egrep '/' | xargs --max-args 1 basename | sort | uniq -c | egrep -v '^ 1 ' | while read n de ; do echo rm -rfv dir2/$de ; done
올바른 경우 에코를 제거합니다.