![서로 다른 두 디렉터리 사이의 공통 하위 디렉터리 이름을 식별하고 삭제합니다.](https://rvso.com/image/97237/%EC%84%9C%EB%A1%9C%20%EB%8B%A4%EB%A5%B8%20%EB%91%90%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%20%EC%82%AC%EC%9D%B4%EC%9D%98%20%EA%B3%B5%ED%86%B5%20%ED%95%98%EC%9C%84%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EC%8B%9D%EB%B3%84%ED%95%98%EA%B3%A0%20%EC%82%AD%EC%A0%9C%ED%95%A9%EB%8B%88%EB%8B%A4..png)
나는 두 개의 디렉토리가 있고 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
우리는 삭제하려는 다른 경로 "dir2"와 선행 디렉터리(%f) 없이 파일 이름만 인쇄하는 데 사용하고 있습니다 . 또한 공백이 있는 파일 이름과 관련하여 이 모든 것을 안전하게 만드는 xarg
옵션을 사용하기 위해 개행 대신 널 바이트 '\0'으로 문자열을 종료합니다 . -0
그런 다음 xargs
stdin을 읽고 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
올바른 경우 에코를 제거하십시오.