서로 다른 두 디렉터리 사이의 공통 하위 디렉터리 이름을 식별하고 제거합니다.

서로 다른 두 디렉터리 사이의 공통 하위 디렉터리 이름을 식별하고 제거합니다.

수백 개의 하위 디렉터리가 있는 두 개의 디렉터리가 있습니다 dir1. 나는 단지 공유되는 하위 디렉토리 이름에 대한 정보가 필요하고 그 이름을 체계적으로 제거해야 합니다 . 파일이나 파일 내용을 비교할 필요가 없습니다. 성능dir2depth 1dir1dir2dir2

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삭제합니다 .dir2dir1

먼저 파이프를 제거 하고 출력을 확인하여 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

올바른 경우 에코를 제거합니다.

관련 정보