2014-11-12 3 views
1

linux 터미널을 사용하여 파일 이름에 고유 한 숫자 문자열이없는 폴더의 모든 파일을 삭제하고 싶습니다. 예 :linux 터미널에서 filename에 같은 문자열을 포함하고있는 파일을 찾아서 삭제하십시오.

werrt-110009.jpg => delete 
asfff-110009.JPG => delete 
asffa-123489.jpg => maintain 
asffa-111122.JPG => maintain 

의견이 있으십니까?

+0

어떤 셸을 사용하고 있습니까? –

+0

/bin/bash를 사용 중입니다. – ptminor

+0

완전히 새로운 답변을 작성했습니다. 이것이 의미하는 바가 맞는지 확인하십시오. –

답변

0

가 난 단지 지금 당신의 질문을 이해, 나는 생각한다. (특정 폴더에서) 고유하지 않은 숫자 값을 포함하는 모든 파일을 제거하려고합니다. 파일 이름에 다른 파일 이름에서도 찾을 수있는 값이 들어 있으면 두 파일을 모두 제거하려고합니다. 것

array=(werrt-110009.jpg asfff-110009.JPG asffa-123489.jpg asffa-111122.JPG) 

그리고 delete에 결과 : 당신의 예에서

# put all files in your folder in a list 
# for array=(*) to work make sure you have enabled nullglob: shopt -s nullglob 
array=(*) 
delete=() 

for elem in "${array[@]}"; do 
    # for each elem in your list extract the number 
    num_regex='([0-9]+)\.' 
    [[ "$elem" =~ $num_regex ]] 
    num="${BASH_REMATCH[1]}" 
    # use the extracted number to check if it is unique 
    dup_regex="[^0-9]($num)\..+?(\1)" 
    # if it is not unique, put the file in the files-to-delete list 
    if [[ "${array[@]}" =~ $dup_regex ]]; then 
     delete+=("$elem") 
    fi 
done 

# delete all found duplicates 
for elem in "${delete[@]}"; do 
    rm "$elem" 
done 

array은 다음과 같습니다

(이것은 가장 빠른 방법을하지 않을 수 있습니다) 나는 그렇게 할 것입니다 방법입니다 :

delete=(werrt-110009.jpg asfff-110009.JPG) 

이것은 무엇을 의미합니까?

+0

필요한 경우 로컬 드라이브에서 작동합니다. 타사 서버에 마운트 된 드라이브의 경우 너무 느립니다. 서버에서 나는 다음을 사용한다 : : 감사합니다. – ptminor

0

당신이 -regex 매개 변수 및 디렉토리에 일치하는 모든 문자열 파일을 삭제

0

사용 "RM은"명령 한 명령을 할 수있는 -delete 매개 변수 와 함께 명령을 찾을 리눅스를 사용할 수 있습니다

cd <path-to-directory>/ && rm *110009* 

이 명령은 문자열이 일치하는 모든 파일을 삭제하는 데 도움이되며 파일 이름에 string의 위치에 의존하지 않습니다.

일치하는 문자열이있는 파일을 삭제하는 또 다른 옵션으로 rm 명령 옵션을 언급했습니다. 다음은

귀하의 요구 사항을 달성하기 위해 전체 스크립트이며,이 스크립트를 실행하는 방법
#!/bin/sh -eu 

#provide the destination fodler path 
DEST_FOLDER_PATH="$1" 

TEMP_BUILD_DIR="/tmp/$(date +%Y%m%d-%H%M%S)_clenup_duplicate_files" 
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
clean_up() 
{ 
    if [ -d $TEMP_BUILD_DIR ]; then 
     rm -rf $TEMP_BUILD_DIR 
    fi 
} 
trap clean_up EXIT 

[ ! -d $TEMP_BUILD_DIR ] && mkdir -p $TEMP_BUILD_DIR 
TEMP_FILES_LIST_FILE="$TEMP_BUILD_DIR/folder_file_names.txt" 
echo "$(ls $DEST_FOLDER_PATH)" > $TEMP_FILES_LIST_FILE 
while read filename 
do 
    #check files with number pattern 
    if [[ "$filename" =~ '([0-9]+)\.' ]]; then 
     #fetch the number to find files with similar number 
     matching_string="${BASH_REMATCH[1]}" 

     # use the extracted number to check if it is unique 
     #find the files count with matching_string 
     if [ $(ls -1 $DEST_FOLDER_PATH/*$matching_string* | wc -l) -gt 1 ]; then 
      rm $DEST_FOLDER_PATH/*$matching_string* 
     fi 
    fi 
    #reload remaining files in folder (this optimizes the loop and speeds up the operation 
    #(this helps lot when folder contains more files)) 
    echo "$(ls $DEST_FOLDER_PATH)" > $TEMP_FILES_LIST_FILE 
done < $TEMP_FILES_LIST_FILE 

exit 0 

, 경로에 스크립트/delete_duplicate_files.sh 같은 파일에

  1. 저장이 스크립트 (당신은
  2. 만들기 스크립트 실행) 당신이 원하는대로 이름을 바꿀 수 있습니다

    chmod를 + X {경로에 스크립트}

    {경로를 삭제해야 /delete_duplicate_files.sh

  3. (일치하는 번호 패턴 파일) 파일을 복제 디렉토리 경로를 제공하여 스크립트를 실행 -script} /delete_duplicate_files.sh "{경로에 디렉토리}"

+0

감사합니다.하지만 이중 입력 및 수동 입력이지만 폴더에는 10KB 이상의 파일이 있어야합니다.파일을 숫자 문자열로 그룹화 한 다음 그룹 수가 1보다 큰 위치를 삭제해야한다고 생각했습니다. – ptminor

+0

정교한 스크립트를 이용해 주셔서 감사합니다. 불행히도 다음과 같은 오류가 발생합니다. {경로 대 스크립트} /delete_duplicate_files.sh : 22 : {경로 대 스크립트} /delete_duplicate_files.sh : [[: 찾을 수 없습니다. – ptminor

+0

path-to-script ->는 스크립트를 보관할 디렉토리 경로입니다. 예를 들어이 스크립트를 홈 폴더에 보관하려면 $ HOME/delete_duplicate_files.sh에 스크립트를 저장하십시오. chmod + x $ HOME/delete_duplicate_files.sh를 입력하십시오. 이 후, path-to-directory -> 파일이 위치한 디렉토리 경로는 $ HOME/images이며, $ HOME/delete_duplicate_files.sh "$ HOME/images"와 같이 스크립트를 실행해야합니다. –