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

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

나는 두 개의 디렉토리가 있고 dir1dir2디렉토리에는 수백 개의 하위 디렉토리가 있습니다 depth 1. dir1dir2에서 공통적으로 삭제되는 하위 디렉토리 이름에 대한 정보만 필요합니다 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우리는 삭제하려는 다른 경로 "dir2"와 선행 디렉터리(%f) 없이 파일 이름만 인쇄하는 데 사용하고 있습니다 . 또한 공백이 있는 파일 이름과 관련하여 이 모든 것을 안전하게 만드는 xarg옵션을 사용하기 위해 개행 대신 널 바이트 '\0'으로 문자열을 종료합니다 . -0그런 다음 xargsstdin을 읽고 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

올바른 경우 에코를 제거하십시오.

관련 정보