Я хочу удалить все файлы в текущем дереве каталогов, кроме тех, что в save
. Я выполнил эту команду:
find . \( -name save -prune \) -o -type f -ls | grep /save/
и он не нашел ни одного. Но когда я запустил эту команду:
find . \( -name save -prune \) -o -type f -delete
Все эти файлы в / save / исчезли. Чего мне не хватает?
mv save/ ../some/safer/location
до такой «универсальной» команды удаления (... но, конечно, до вашего поста я бы сделал такую же проверку и столкнулся с той же проблемой!). Теперь найдите хорошего «восстановителя» для файловой системы, в которой были файлы ^^Ответы:
-delete
подразумевает,-depth
что не работает с-prune
(-depth
начинается с листьев). В руководстве к версии GNU есть предупреждение (-delete
это расширение FreeBSD, теперь также поддерживаемое GNUfind
и некоторыми другими реализациями).Здесь у вас есть возможность использовать
rm
вместо:(потенциально небезопасно, если там есть каталог, доступный для записи другими, так как можно заставить файлы удалять вне текущего дерева каталогов, заменяя каталоги символическими ссылками во время выполнения этой команды).
Более безопасная альтернатива:
Это не имеет проблемы, упомянутой выше, но означает запуск по одному
rm
на файл.--
Необходимо для реализации FreeBSD, а не GNU один , что имена файлов префиксы с./
.В качестве альтернативы, как предложил Костас:
(но это все равно без необходимости спускается в
save
каталоги)Это
LC_ALL=C
означает, что*
соответствует любой последовательности байтов (даже тех, которые не образуют допустимых символов в текущей локали). Обратите внимание, что это повлияет на язык сообщений об ошибках (английский вместо языка пользователя).источник
rm
?