쉘 스크립트: 동일한 이름의 폴더가 없으면 파일 삭제

쉘 스크립트: 동일한 이름의 폴더가 없으면 파일 삭제

폴더 세트와 *.DAT파일 세트가 있습니다. 같은 이름의 폴더가 없으면 파일을
제거하고 싶습니다 . 이 솔루션을 찾는 데 시간이 좀 걸렸습니다.*.DAT.DAT

find . -type d > dirs.txt
for F in `find *.DAT`
do
  F=$(sed 's|\.DAT||g' <<< $F)
  if grep "$F" dirs.txt; then
    echo "$F found"
  else
    rm $F.DAT
  fi
done

하지만 훨씬 더 쉬운 솔루션이 있어야 한다고 생각합니다(우아한 한 줄짜리? 파일을 만들지 않고? ...?). 내가 맞나요?

답변1

사용 중인 경우 sed제거하기 위해 사용할 필요가 없습니다 . 내장 매개변수 확장은 서브쉘 및 외부 프로그램을 사용하지 않고도 동일한 결과를 얻습니다..DATbash${F%.DAT}

디렉터리가 .DAT파일을 기준으로 임의의 위치에 있는 경우 디렉터리 목록 파일이 이 문제를 해결하는 가장 효율적인 방법이지만 둘 다 동일한 위치에 있는 경우 훨씬 더 간단한 대답은 다음과 같습니다.

find *.DAT | while read -r f; do if [ -d "${f%.DAT}" ]; then echo "${f%.DAT}" found; else rm "$f"; fi; done

이는 공백이 포함된 파일 이름을 처리하지만 솔루션에서는 처리하지 않습니다.

다른 껍질에도 비슷한 기술을 사용할 수 있지만 이에 대해 말할 수는 없습니다.

관련 정보