2013-04-24 1 views
0

내가 다른 확장자를 가진 많은 파일이 들어있는 큰 파일 시스템 구조를 가지고 종료와 함께 리눅스 FS에 중복 파일을 제거합니다 그래서 :

index.htmle 
index.htmlee 
package.zipe 

등등.

나는 중복 파일을 모두 e+$ 끝에 반복적으로 제거해야합니다. 파일

file.exe 

이있는 경우 그러나

file.exee 
file.exeee 

하지만

file.exe 

그 파일을 제거하는 가장 좋은 방법은 무엇입니까 제거해야합니까?

+0

은 예를 들어. (exe, png, zip, txt ....) 아니면 아무것도 될 수 있습니까? – Kent

+0

불행히도 그것은 무엇이든 될 수 있습니다. – hsz

+0

네가 무엇이든 될 수 있다면'ee.e'를 어떻게 말할 수 있고'ee.ee'와'ee.eee'는'ee.e'의 세 가지 다른 파일 또는 모든 dup입니까? 또는'ee.e'와'ee.ee'는 다른 파일이고'ee.eee'는'ee.ee'의 dups입니까? – Kent

답변

2

먼저 디렉토리에있는 모든 파일의 목록이 있다고 가정합니다. 일반 텍스트 파일 일 수 있습니다. 의 그것 list

다음이 한 줄이 일을 할 것 부르 자 :

sort list|awk '{if(p&&$0~p"e+$")print "rm "$0;p=$0}' 

이 줄 위의 rm foo 명령, foo는 중복 파일입니다 인쇄됩니다. 다음의 예제를 보자 :

kent$ cat list 
index.html 
logo.png 
logo.pnge 
package.zip 
index.htmle 
index.htmlee 
package.zipe 
file.exe 
file.exee 
file.exeee 

kent$ sort list|awk '{if(p&&$0~p"e+$")print "rm "$0;p=$0}' 
rm file.exee 
rm file.exeee 
rm index.htmle 
rm index.htmlee 
rm logo.pnge 
rm package.zipe 

당신이 볼 수있는 모든 중복 된 파일은 rm command 생성에 있습니다.

: 파일 이름에 공백 및 기타 특수 문자를 가질 수 있기 때문에, 그것은 좋은 방법이 따옴표와 파일 이름을 래핑하는 것입니다

sort list|awk '{if(p&&$0~p"e+$")print "rm "$0;p=$0}'|sh 

편집 : 당신은 너무 |sh에 단지 파이프 라인을 실행하려면

sort list|awk '{if(p&&$0~p"e+$")print "rm \""$0"\"";p=$0}' 
+0

그것은 매력처럼 작동합니다. 'rm'을 실행하기 전에 파일을 출력하는 방식을 좋아합니다. 그러면 목록을 확인할 수 있습니다. 너는 위대한 사람이야! – hsz

+0

'list'에서 pls가 빈 줄을 포함하지 않는다는 것을 잊어 버렸습니다. 그것은 점검 될 수 있었지만, 나는이 대답에서 그것을하지 않았다. – Kent

+0

물론. 나는 알레 디가'find. > list'를 입력하면 결과가 저장됩니다. – hsz

0

당신은

find ./ -name "*e" 
"E"로 끝나는 모든 파일을 찾을 필요

그런 다음 긴 이름이 처음

| sort -r 

그런 다음 "E"

chk4File=`echo $FILE | sed -e 's/e$//g'` 

를 제거 와서 다음 이전 'E'로 파일을 제거하는 존재 확인하기 위해 비교 이름을 일종의 반전 할 필요가 끝 부분

if [ "${FILE}" != "${chk4File}" ] && [ -e ${chk4File} ]; then 

예를 들어 파일을 제거하지 않을 것입니다 ... 어떤 파일을 제거할지 말지 알려주세요. est는 실제 파일을 삭제하기 전에 파일을 삭제하지 않고 테스트를 실행하고 결과를 검토합니다. 그냥 rm 명령에서 # in을 제거하여 라이브 상태로 만드십시오.

#!/bin/sh 
for FILE in `find ./ -name "*e" | sort -r` 
do 
    chk4File=`echo $FILE | sed -e 's/e$//g'` 
    if [ "${FILE}" != "${chk4File}" ] && [ -e ${chk4File} ]; then 
     echo "Removing ${FILE} since ${chk4File} was found.." 
     #rm -rf ${FILE} 
    else 
     echo "NOT Removing ${FILE} since ${chk4File} was NOT found.." 
    fi