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, получает имя каталога каждого файла jpg в цикле while, сортирует и удаляет дубликаты (на основе @heemayl), затем считывает это в цикле while, чтобы удалить каталог эскизов.
Один из способов сделать это — использовать -
сокращение для стандартного ввода с такими вот документами
command - <<EOF
<file>
<contents />
</file>
EOF
То, как оболочка реализует здесь -документы различаются между оболочками, и то, что используется за кулисами, может различаться в зависимости от факторов времени выполнения. Оболочка bash
, например, пытается использовать канал внутри процесса оболочки для документов короче, чем размер канала системы.
Вы можете получить доступ к стандартному потоку ввода, прочитав из /dev/fd/0
или /dev/stdin
в большинстве систем Unix. Их доступность не гарантируется, но сегодня они реализованы в большинстве доступных систем Unix.
Использование одного из этих путей для предоставления вашей команде имени пути и, в то же время, предоставление данных в ее стандартном входном потоке должно решить вашу проблему.
thecommand /dev/stdin <<'END_XML'
Some XML document
goes here.
END_XML
Использование /dev/stdin
таким образом будет работать до тех пор, пока вашей команде не нужно выполнять поиск в заданном файле. Если это так, вы можете вместо этого временно записать ввод в реальный файл:
tmpfile=$(mktemp) || exit
cat <<'END_XML' >"$tmpfile"
Some XML document
goes here.
END_XML
thecommand "$tmpfile"
rm "$tmpfile"
Использование документа здесь -вместе с одним из этих специальных путей является удобным способом предоставления эфемерного ввода другим командам, как в
sed -f /dev/stdin file <<'END_SED'
Some sed script
goes here
END_SED