두 폴더에 세 개의 파일이 있습니다. 파일 이름이 지정되고 a.txt
및 폴더 에 b.txt
위치합니다 . 앱을 사용했어요c.txt
A
B
전체 파일 미니 비교기폴더를 비교하고 해당 A
폴더에 로그를 저장합니다.
로그에는 다음과 같은 텍스트가 있습니다.
Different: A=/sdcard/A/a.txt B=/sdcard/B/a.txt
Same: A=/sdcard/A/b.txt B=/sdcard/B/b.txt
Different: A=/sdcard/A/c.txt B=/sdcard/B/c.txt
sed
및 rm
/또는 다른 명령을 사용하여 "동일한" 파일을 영구적으로 삭제/삭제하려면 어떻게 해야 합니까 ?
답변1
당신은
$ tree
.
|-- A
| |-- a.txt
| |-- b.txt
| `-- c.txt
`-- B
|-- a.txt
|-- b.txt
`-- c.txt
2 directories, 6 files
사용 fdupes
:
$ fdupes -1 A B
A/b.txt B/b.txt
fdupes
파일 내용을 기반으로 중복을 감지합니다. 이 -1
플래그를 사용하면 각 중복 세트의 파일 이름이 한 줄에 출력됩니다. 여기에서는 b.txt
파일이 동일한 것으로 감지됩니다 .
다음을 사용하여 중복 항목을 제거 할 수 있습니다 fdupes
.
$ fdupes --delete A B
[1] A/b.txt
[2] B/b.txt
Set 1 of 1, preserve files [1 - 2, all]: 1
[+] A/b.txt
[-] B/b.txt
어느 파일(또는 두 파일 모두)을 유지할지 대화형으로 묻습니다. 1
삭제 A/b.txt
해도 파일이 유지 되도록 작성했습니다 .B/b.txt
fdupes
( )설명서를 참조하세요 man fdupes
. 시스템에 설치되어 있지 않은 경우 패키지 관리자를 사용하여 설치하십시오. 대화형 프롬프트 없이 자동으로 파일을 삭제하도록 만들 수도 있지만 실행할 때 주의해야 합니다. 파일을 삭제할 수 있는 명령을 실행하기 전에 항상 데이터를 백업하십시오.
적어도 하나 의 fdupes
복제본은 항상 유지됩니다. 모든 중복 항목을 제거하려면 fdupes
유사한 질문에 대한 SuperUser의 답변에 언급된 이 패치 버전에 관심이 있을 수 있습니다.https://superuser.com/a/947770/96962(나는 이것을 테스트하지 않았습니다).
가지고 있는 로그 파일을 구문 분석하는 것보다 사용을 권장하는 이유는 fdupes
텍스트 문서에 포함된 파일 이름은 올바르게 구문 분석하기 어렵기 때문입니다. 아마도 그렇지 않을 것이다언제나어려울 수도 있지만(이 특정 예에서는 쉽습니다) Unix에서는 파일 및 디렉터리 이름에 공백과 줄 바꿈을 허용한다는 점에 유의하세요. 이것은기술적으로라는 파일이 있을 수 있습니다.
a.txt
Same: A=
이름에 줄 바꿈이 포함되어 있습니다.
답변2
그리고 awk
:
awk -F'[:]' '/Same:/{print $0}' logfile | xargs -n1 | awk -F'=' '{print $2}' | xargs rm -rf
awk
로그 파일에서 "Same:" 키워드가 포함된 줄을 찾은 다음 xargs
변수와 경로(예: A=***)를 각 줄에 대조하고 awk
절대 경로를 캡처합니다. 마지막 단계에서는 경로를 삭제하라는 xargs
요청을 받습니다 .rm
xargs
경로를 삭제 하라는 메시지가 표시 되면 rm
파일이 확실히 삭제된다는 점에 유의하는 것이 중요합니다 . 사용자에게 삭제 확인을 상기시키기 -I
위해 플래그를 추가할 수 있습니다 .rm
- 3개 이상의 파일을 삭제하기 전이나 재귀적으로 삭제할 때 한 번 메시지를 표시하며 대부분의 오류에 대한 보호를 제공하면서 -i보다 덜 방해적입니다.
또는grep
grep "Same:" logfile | grep -oP '/[^ ]*' | xargs rm -rf
첫 번째는 grep
키워드가 포함된 행을 찾습니다 Same
.
두 번째는 grep
로그 파일을 채워 키워드와 관련된 경로를 제외한 모든 것을 제거합니다. 마지막으로 경로 삭제를 xargs
요청합니다 .rm
답변3
동일한 파일을 모두 삭제하시겠습니까, 아니면 n-1개의 파일만 삭제하고 복사본을 유지하시겠습니까? 글쎄, 왜 안돼?
awk '/Same:/ {for (i=2; i<=NF; i++) {split ($i, T, "="); print "rm", T[2]}}' log
rm /sdcard/A/b.txt
rm /sdcard/B/b.txt
sh
결과가 만족스러우면 입력하세요. 복사본도 보관하려면 처음부터 순환하세요 i=3
.
또는 다음이 없는 또 다른 접근 방식 awk
:
echo rm $(md5sum path/to/files* | sort | uniq -Dw33 | cut -d" " -f3-)
rm file2 file4
echo
결과가 만족스러우면 삭제하세요. 파일 이름에 공백이 포함된 경우 추가 단계가 필요합니다.