이 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 {}/thumbnails
thumbnails
끝에 추가한 다음 결과 디렉터리를 제거합니다.
답변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 루프에서 이를 읽어 썸네일 디렉토리를 제거합니다.