두 디렉토리에서 이름, 크기, 유형이 같은 파일을 검색하고 이 디렉토리 중 하나에서 파일을 삭제하려면 어떻게 해야 합니까?
답변1
사용 fdupes
:
fdupes --delete dir1 dir2
fdupes
파일 이름이나 파일 형식은 테스트되지 않지만 파일 크기와 내용은 테스트됩니다(암시적으로 파일 형식 포함).
예:
$ mkdir dir1 dir2
$ touch dir{1,2}/{a,b,c}
$ tree
.
|-- dir1
| |-- a
| |-- b
| `-- c
`-- dir2
|-- a
|-- b
`-- c
2 directories, 6 files
$ fdupes --delete dir1 dir2
[1] dir1/a
[2] dir1/b
[3] dir1/c
[4] dir2/a
[5] dir2/b
[6] dir2/c
Set 1 of 1, preserve files [1 - 6, all]: 1
[+] dir1/a
[-] dir1/b
[-] dir1/c
[-] dir2/a
[-] dir2/b
[-] dir2/c
$ tree
.
|-- dir1
| `-- a
`-- dir2
2 directories, 1 file
답변2
나는 2개의 디렉토리 p1과 p2를 예로 들어 보겠습니다.
먼저 p1 및 p2 디렉터리 파일 이름의 출력을 2개의 출력 파일에 저장합니다.
find /root/p1 -type f |awk -F "/" '{print $NF}' > /var/tmp/P1_file.txt
find /root/p2 -type f |awk -F "/" '{print $NF}' > /var/tmp/P2_file.txt
이제 두 디렉터리 모두에서 공통 파일 이름을 찾아서 그 중 하나에서 삭제하겠습니다. /root/p1에서 중복된 파일을 삭제하고 /root/p2에 파일을 보관하고 싶습니다.
awk 'NR==FNR {a[$1];next}($1 in a) {print $1}' /var/tmp/P1_file.txt /var/tmp/P2_file.txt |awk '{print "rm -rvf" " " "/root/p1/"$1}' | sh
테스트를 거쳐 잘 작동함
답변3
dircmp
많은 Unix에 존재하는 명령을 사용하는 것이 좋습니다 .
바라보다:
man dircmp
이 -d
옵션이 가장 적합하다고 생각되는 옵션인 것 같습니다.
dircmp -d dir1 dir2
dir1
및 의 내용을 비교 하고 유사한 출력을 dir2
표시합니다 .diff
답변4
린트이를 수행하는 옵션은 다음과 같습니다.
rmlint -T duplicates --match-basename --keep-all-tagged --must-match-tagged /duplicates // /originals
("//" 구분 기호는 "표시" 경로를 식별합니다.--모든 태그 유지그리고--태그와 일치해야 함스위치)
중복이 발견되면린트실행 가능한 스크립트 생성rmlint.sh(확인 후) 실행하여 중복 항목을 제거할 수 있습니다.