find
предикаты и действия образуют логическое выражение, которое оценивается слева направо с помощью короткого замыкания.
Ваше выражение:
find . -delete -name "*.swp"
эквивалентно выражению bash:
rm "$file" && [[ $file == *.swp ]]
Это удаляет файл, и если удаление прошло успешно, оно проверяет имя.
Сравните это с:
# Like: find . -name "*.swp" -delete
[[ $file == *.swp ]] && rm "$file"
В этом случае оно проверяетназвание.Если проверка прошла, он удаляет файл.Это то, что вы намеревались.
Это поведение очень полезно, потому что оно позволяет вам писать более продвинутый поток управления и ветвления:
find . -name '.git' -prune \
-o \( -name '*.xz' -exec xz -d {} \; \
-o -name '*.gz' -exec gzip -d {} \; \) \
-printf 'Successfully extracted %f\n'
Это выражение пропустит любой каталог .git
,запустите xz -d
только для файлов .xz, gzip -d
только для файлов .gz и, наконец, напечатайте сообщение для извлеченных файлов.
Что касается ваших файлов, они удалены.Часто невозможно вернуть их обратно.Вам придется восстановить их из резервной копии или, если вы в отчаянии, попытаться следовать руководству по удалению файлов для вашей ОС и файловой системы (но, опять же, это часто невозможно).