Найти -exec dry run?
Есть ли способ увидеть, каков будет результат find . -exec somecommand {} \;
с заменами, без фактического выполнения команд? Нравится пробный прогон (или пробный прогон, или печать)?
Например, предположим, что у меня есть следующая файловая структура:
/a/1.txt
/a/2.txt
/a/b/3.txt
Есть ли способ протестировать find . type f -exec rm {} \;
из a
каталога, чтобы вывод выводился на стандартный вывод, но не выполнялся, например:
rm 1.txt
rm 2.txt
rm b/3.txt
Примечание к обновлению : rm
это просто пример команды, меня интересует общий случай
Ответы
Вы можете бежать echo rm
вместоrm
find . type f -exec echo rm {} \;
Также find
есть -delete
возможность удалять найденные файлы.
В rm
частности, вам не нужно -exec
: просто запустить find . -type f
в список и добавить, -delete
чтобы удалить файлы, перечисленные предыдущей командой (очевидно, запрещая создание / удаление любых совпадающих файлов в это время).
Кроме того , для команд , как rm
которые принимают произвольное число аргументов , вы хотите заменить \;
с , +
чтобы работать как несколько команд , как это возможно.
Это немного сложно, но, в отличие от подходов с использованием echo
, приведенный ниже выводит код, который вы можете запустить в своей оболочке без каких-либо изменений, чтобы получить правильный результат, даже если ваши имена файлов содержат кавычки, пробелы, метасимволы оболочки и т. Д.
printcmd() { printf '%q ' "$@"; printf '\n'; } find . -exec bash -c "$(declare -f printcmd); "'printcmd "$@"' _ \
somecommand {} \;
Обратите внимание, что строка, которую мы добавляем к нашему -exec
аргументу, в точности bash -c "$(declare -f printcmd); "'printcmd "$@"' _
- $(declare -f printcmd)
расширяется до кода функции; после этого мы фактически вызываем функцию с аргументами $1
и далее и помещаем _
в качестве заполнителя для $0
.
Вы можете заменить zsh
или ksh
вместо bash, если хотите, чтобы вывод был экранирован для этой оболочки.