관련 파일명을 확인하고 그 중 하나를 삭제하세요.

관련 파일명을 확인하고 그 중 하나를 삭제하세요.

이름에 문자열이 포함된 파일을 찾으려면 스크립트를 작성해야 합니다. 이름은 같지만 해당 문자열이 없는 파일이 있으면 원본 파일을 삭제하고 싶습니다.

예를 들어, 다음 파일이 포함된 디렉터리에 있다고 가정해 보겠습니다.

algomb
gomba
alb
algomba
alba

하위 문자열이 다음과 같다면 , 및 을 gom고려하겠습니다 . 각 이름에서 제거한 후 , 및 가 있는지 확인합니다 . 존재 하는 것이므로 삭제 하고 나가겠습니다.algombgombaalgombagomalbbaalbaalbalbaalgombalgomba

alb
alba
gomba

내가 끝나면 디렉토리에.

내가 시도한 것은 다음과 같습니다.

#!/bin/bash
sz="gom"

talal=`find . -type f -name "*$sz*" -exec basename {} \;`
ossz=`find . -type f -exec basename {} \;`
c=`echo ${talal%%:*}${talal##*:}`

for c in ossz; do       
    if [ ! -d ]; then
        echo "This is a directory"  
    else    
        if [ -f ];
        then
            find .-type f -name "*$sz*" -exec basename {} \;  
        else
            echo ${talal%%:*}${talal##*:} 
        fi  
    fi
done

그래서 이것은 작동합니다. echo ${talal%%:*}${talal##*:}"gom" 없이 파일 이름을 반환합니다 . 하지만 이 값을 f 결과와 ind . -type f -exec basename {} \;비교할 수는 없습니다.

하위 문자열을 찾을 수 있다면 어떻게 파일을 테스트하고 적절한 파일을 제거할 수 있습니까?

답변1

다음은 요구 사항을 충족해야 합니다.

#!/bin/bash
sz="gom"
dir="/where/the/files/are"

find $dir -type f -name "*${sz}*" -print0 | while read -d '' -r c; do
    if [[ -f "$(echo $c | sed 's/'"${sz}"'//g')" ]]; then
        # Strip the 'echo' to have this actually do things
        echo rm -v "$c"
    fi
done

변경 및 수정 사항에 대한 참고 사항:

  • Find -printf "%f\n"가 우수합니다 -exec basename {} \;. 이 경우 스크립트가 비플랫 디렉터리 구조에 대해 안전하도록 디렉터리 이름 제거에서 find를 제거했습니다.
  • for c in ossz작동하지 않습니다. 알몸 이름 ossz은 변수가 아닙니다. $ossz필요할 것입니다.
  • 가독성을 위해 sedbash 패턴 일치 및 교체에 의존하는 것보다 bash를 사용하는 것이 더 나을 수 있습니다.

예:

다음 파일이 포함된 디렉터리의 경우:

alb  alba  algomb  algomba  gomb

위 스크립트는 다음을 출력합니다.

rm -v ./algomb
rm -v ./algomba

관련 정보