이름에 문자열이 포함된 파일을 찾으려면 스크립트를 작성해야 합니다. 이름은 같지만 해당 문자열이 없는 파일이 있으면 원본 파일을 삭제하고 싶습니다.
예를 들어, 다음 파일이 포함된 디렉터리에 있다고 가정해 보겠습니다.
algomb
gomba
alb
algomba
alba
하위 문자열이 다음과 같다면 , 및 을 gom
고려하겠습니다 . 각 이름에서 제거한 후 , 및 가 있는지 확인합니다 . 존재 하는 것이므로 삭제 하고 나가겠습니다.algomb
gomba
algomba
gom
alb
ba
alba
alb
alba
algomb
algomba
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
필요할 것입니다.- 가독성을 위해
sed
bash 패턴 일치 및 교체에 의존하는 것보다 bash를 사용하는 것이 더 나을 수 있습니다.
예:
다음 파일이 포함된 디렉터리의 경우:
alb alba algomb algomba gomb
위 스크립트는 다음을 출력합니다.
rm -v ./algomb
rm -v ./algomba