find 명령의 출력을 사용하여 특정 디렉터리 삭제

find 명령의 출력을 사용하여 특정 디렉터리 삭제

이 찾기 명령을 실행하면 다음과 같습니다.

find /html/car_images/inventory/ -type f -iname \*.jpg -mtime -4

나는 다음과 같은 결과를 얻습니다.

/html/car_images/inventory/16031/16031_06.jpg
/html/car_images/inventory/16117/16117_01.jpg
/html/car_images/inventory/16126/16126_01.jpg
/html/car_images/inventory/16115/16115_01.jpg
/html/car_images/inventory/16128/16128_02.jpg
/html/car_images/inventory/16128/16128_03.jpg
/html/car_images/inventory/16128/16128_04.jpg

내 목표는 각 디렉터리에 있는 "Thumbnails" 폴더를 삭제하는 것입니다(예: 이 폴더 삭제: /html/car_images/inventory/16128/thumbnails/ 삭제도 하고/html/car_images/inventory/16115/thumbnail/

위의 find 명령에서 출력의 각 줄을 가져온 다음 "*.jpg”를 “thumbnail”로 변경하고 접두사 “rm -fr”을 추가하면 다음과 같은 결과가 나옵니다.

rm -fr /var/www/html/car_images/inventory/16115/thumbnails/
rm -fr /var/www/html/car_images/inventory/16128/thumbnails/

등...

이 작업을 수행하는 방법에 대한 아이디어가 있습니까? (아마도 find 및 sed를 사용하거나 cut의 -exec 옵션을 사용할 수 있을까요?)

(내 전체 목표를 표현하는 또 다른 방법은 X일보다 "젊은" .jpg 파일이 포함된 폴더의 "thumbnails" 폴더를 삭제하는 것입니다.)

답변1

파일 이름에 개행 문자가 없다고 가정합니다.

find /html/car_images/inventory/ -type f -iname \*.jpg -mtime -4 \
     -exec sh -c 'echo "${1%/*}"' _ {} \; | sort -u | \
          xargs -d $'\n' -I{} rm -r {}/thumbnails
  • 매개변수 확장, ${1%/*}발견된 각 항목에서 파일 이름이 없는 부분 추출

  • sort -u중복 항목이 없도록 항목을 정렬한 다음 고유하게 만듭니다.

  • xargs -I{} rm -r {}/thumbnailsthumbnails끝에 추가한 다음 결과 디렉터리를 삭제합니다.

답변2

while read dir;
  do
    rm -r "$dir"/thumbnails;
done < <(while read file; do dirname "$file"; done < <(find /html/car_images/inventory/ -type f -iname \*.jpg -mtime -4) | sort -u)

이는 프로세스 대체 내의 프로세스 대체를 사용하여 수행됩니다.

OP 기준에 따라 파일을 찾고, while 루프에서 각 jpg 파일의 디렉터리 이름을 가져오고, @heemayl에서 영감을 받아 중복 항목을 정렬 및 제거한 다음, while 루프에서 파일을 읽어 썸네일 디렉터리를 제거합니다.

관련 정보