find 명령의 출력을 사용하여 특정 디렉토리를 제거하십시오.

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

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

아마도 위의 find 명령에서 출력의 각 줄을 가져온 다음 "를 대체하는 스크립트를 생각하고 있습니다.*.jpg"를 "thumbnails"로 바꾸고 접두사 "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 루프에서 이를 읽어 썸네일 디렉토리를 제거합니다.

관련 정보