Вы можете использовать команду wait
:
(echo starting & sleep 10 & wait) && echo done
Вы видите, что строка "start" происходит сразу, а "done" ждет 10 секунд.
zsh -c 'rm -f -- **/*(^/)'
rm -ri -- *
Это рекурсивно(**/
)удалит все (*
), что не является каталогом(^/
)с помощью zsh
; затем используйте существующую оболочку для интерактивного удаления оставшихся (каталогов ). Чтобы включить точечные файлы в первоначальное удаление, используйте:
zsh -c 'rm -f -- **/*(D^/)'
, затем:
rm -ri -- *
В некоторых rm
реализациях (DragonFly BSD, FreeBSD и по крайней мере GNU ),-I
(заглавная i )— это то, что вам нужно. -i
запрашивает подтверждение для каждого файла, в то время как-I
(заглавная буква i )запрашивает подтверждение один раз, когда файлов больше 3 или вы рекурсивно удаляете.
Попробуйте это. Что ж, это может быть диким решением, но я все равно хотел поделиться!
function rm_ {
[[ -d "$1" ]] && rm -rI "$1" || rm -f "$1"
}
Затем используйте rm_ <directory|file>
. Если это directory
, вы получите rm: remove all arguments recursively?
, иначе ничего и файл будет удален.
Таким образом, пользователю не будет выдаваться подсказка при удалении файлов, а пользователю будет выдаваться подсказка при удалении каталога.
Если нужно было использовать только rm -rI
, пользователь получает запрос на подтверждение как для файлов, так и для каталогов, поэтому я использовал комбинацию rm -f
и rm -rI
.
Фрагмент ниже запросит подтверждение один раз, а затем удалит весь каталог'path/to/delete'
read -p 'question ' answer
для отображения 'question '
пользователю и сохранения ответа в переменной ${answer}
. (Завершающий пробел в 'question '
делает подсказку более читаемой)[ ]
с оператором равенства строк =
, чтобы убедиться, что переменная ${answer}
содержит'expected answer'
&&
, чтобы остановить, если какой-либо из шагов не увенчался успехом -, например. [Ctrl]+[C]
был использован для прерывания read
или тестовое предложение [ ]
было неверным rm -rf
-Придумайте как минимум 42 сценария, в которых что-то может пойти не так. Проведите мозговой штурм, чтобы максимально снизить риск rm -rf
PATH_TO_DELETE='path/to/delete'
read -p "Delete path '${PATH_TO_DELETE}'? [y/N] " yn && [ "${yn}" = 'y' ] && rm -rf "${PATH_TO_DELETE}"