
A
디렉토리에 중복 파일 이 있는데 bash 에서 파일 이름을 사용하여 B
속이는 파일을 어떻게 삭제할 수 있습니까 ?B
A
다른 쉘에서 이를 수행하는 방법은 환영받는 보너스입니다.
답변1
일방 통행:
#!/bin/bash
cd ~/B
for file in ~/A/*
do
file1=$(basename "$file")
[ -f "$file1" ] && { echo "deleting $file1 "; rm -- "$file1"; }
done
답변2
한 줄에
grep -f <(ls "A") <(ls "B") | xargs -I'{}' rm "B/{}"
그러나 작동은 파일 이름에만 의존하며 빈 하위 디렉토리에 영향을 미칠 수 있습니다. find -type f -maxdepth 1
대신에 이 사용을 피하려면 ls
.
보다 안전한 확인을 위해서는 @KasyA 수신자를 사용하세요.
답변3
find /path/to/dirA -type f -exec cmp -s '{}' '/path/to/dirB/{}' \; -exec echo rm -v '/path/to/dirB/{}' \;
테스트에서:
$ ls -1 /path/to/dirA
dupfile
file1inA
$ ls -1 /path/to/dirB
dupfile
file1inB
find /path/to/dirA -type f -exec cmp -s '{}' '/path/to/dirB/{}' \; -exec echo rm -v '/path/to/dirB/{}' \;
rm -v /path/to/dirB/./dupfile
참고: echo
테스트 실행에 사용되는 것을 제거하세요.
답변4
cd B
ls ../
A
B
comm <(ls ../A) <(ls ./) -1 -2 -z | xargs -0 rm
comm
세 개의 열을 표시합니다.
- file1(A)에 고유함
- file2(B)에 고유함
- 양쪽 모두에 존재
따라서 열 1, 2를 -1 -2
. -z
구분 기호로 NULL을 사용합니다. 기본값은 `\n' 개행입니다.
파이프 및 파일 이름과 같은 임의 문자열 목록을 처리할 때는 NULL로 구분된 전송이 안전합니다.