파일 삭제 시 파일 이름 목록 제외

파일 삭제 시 파일 이름 목록 제외

디렉토리에 있는 assets/img/fly불필요한 파일을 모두 삭제하고 싶습니다 _posts/2020-10-05-most-beautiful-story-i-ve-ever-heard.markdown. 제외할 파일은 다음과 같습니다.

± |master → origin U:1 ✗| → grep '.jpg' _posts/2020-10-05-most-beautiful-story-i-ve-ever-heard.markdown 
![](/assets/img/fly/UEGDXB3U.jpg)
![](/assets/img/fly/YB59X0IS.jpg)
![](/assets/img/fly/8FBFIDB3.jpg)
![](/assets/img/fly/CGMZAZU6.jpg)
![](/assets/img/fly/HNW7TV6D.jpg)
![](/assets/img/fly/UZRLR5TE.jpg)
![](/assets/img/fly/F6RZHWOD.jpg)
![](/assets/img/fly/LEDROO88.jpg)
![](/assets/img/fly/4LOGZOM0.jpg)
![](/assets/img/fly/OFGII4Z3.jpg)
![](/assets/img/fly/IGTJ2LYH.jpg)
![](/assets/img/fly/UOM780JG.jpg)
![](/assets/img/fly/WY28RY5O.jpg)
![](/assets/img/fly/TVDZMBDI.jpg)

디렉터리의 전체 파일은 다음과 같습니다.

± |master → origin U:1 ✗| → ls assets/img/fly
4LOGZOM0.jpg CGMZAZU6.jpg HNW7TV6D.jpg LEDROO88.jpg OFGII4Z3.jpg TVDZMBDI.jpg UOM780JG.jpg WY28RY5O.jpg YB59X0IS.jpg
8FBFIDB3.jpg F6RZHWOD.jpg IGTJ2LYH.jpg LVPJ7B4F.jpg RDO3AY0Z.jpg UEGDXB3U.jpg UZRLR5TE.jpg XISY5DZD.jpg YIXITHTJ.jpg

프로세스는 grep출력 명령에서 파일 이름을 추출한 다음 이를 ls.

답변1

#!/bin/bash
d="assets/img/fly"
f="_posts/2020-10-05-most-beautiful-story-i-ve-ever-heard.markdown"
 
find "$d" -type f -print0 | 
    grep -vzf <(grep -o "assets.*jpg" "$f") | xargs -0 echo rm --

echo테스트가 정상이면 삭제하세요. 또한 실행 위치를 기준으로 Markdown 파일의 경로를 조정해야 할 수도 있습니다.

find-print0파일 이름을 유지하면서 0으로 구분된 인수를 다음 명령에 전달하여 디렉터리의 모든 파일을 가져옵니다 .

-z플래그를 사용하면 grep이러한 인수가 개행 대신 0 구분 기호로 필터링됩니다. -f인수에서 첫 번째 파일의 패턴을 찾고 -v일치하는 인수를 제외합니다.

패턴이 있는 파일은 실행 중인 프로세스로 대체되며 grep -o제외할 파일의 전체 파일 이름이 반환됩니다. 또한 xargs -0인수를 0으로 구분된 것으로 처리합니다.


모든 파일이 예제와 같다고 가정하고 파일 이름을 유지하지 않는 버전은 다음과 같습니다.

#!/bin/bash
d="assets/img/fly"
f="_posts/2020-10-05-most-beautiful-story-i-ve-ever-heard.markdown"
 
find "$d" -type f | grep -vf <(grep -o "assets.*jpg" "$f") | xargs echo rm --

참고: macOS GNU grep은 옵션을 지원하지 않습니다 -z.

관련 정보