Verwenden Sie die Ausgabe des Find-Befehls, um anschließend ein bestimmtes Verzeichnis zu entfernen

Verwenden Sie die Ausgabe des Find-Befehls, um anschließend ein bestimmtes Verzeichnis zu entfernen

Wenn ich diesen Suchbefehl ausführe:

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

ich bekomme eine Ausgabe wie diese:

/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

Mein Ziel ist es, einen „Thumbnail“-Ordner zu löschen, der in jedem dieser Verzeichnisse vorhanden ist (d. h. diesen Ordner zu löschen: /html/car_images/inventory/16128/thumbnails/ und auch löschen/html/car_images/inventory/16115/thumbnails/

Ich denke vielleicht an ein Skript, das jede Zeile der Ausgabe des obigen Find-Befehls übernimmt und dann "*.jpg" durch "thumbnails" und füge als Präfix "rm -fr" hinzu, sodass ich am Ende Folgendes erhalte:

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

und so weiter...

Irgendwelche Ideen, wie das geht? (Vielleicht mit der Option -exec von find und sed oder cut?)

(eine andere Möglichkeit, mein gesamtes Ziel auszudrücken, ist: Wenn ein Ordner eine JPG-Datei enthält, die „jünger“ als X Tage ist, dann löschen Sie den Ordner „Thumbnails“ in diesem Ordner.)

Antwort1

Angenommen, Sie haben keine Dateinamen mit Zeilenumbrüchen:

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
  • Die Parametererweiterung ${1%/*}extrahiert aus jedem gefundenen Eintrag den Teil ohne den Dateinamen

  • sort -usortiert und dann die Einträge eindeutig macht, so dass wir keine Duplikate haben

  • xargs -I{} rm -r {}/thumbnailsfügt thumbnailsam Ende hinzu, und entfernen Sie dann das resultierende Verzeichnis

Antwort2

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)

Dies wird durch eine Prozesssubstitution innerhalb einer Prozesssubstitution erreicht.

Es findet Dateien basierend auf OP-Kriterien, ruft den Verzeichnisnamen jeder JPG-Datei in einer While-Schleife ab, sortiert und entfernt Duplikate (inspiriert von @heemayl) und liest diese dann in einer While-Schleife, um das Miniaturbildverzeichnis zu entfernen.

verwandte Informationen