rm -rf /some/path/*
удаляет все не скрытые файлы в этом каталоге (и его подкаталогах).
rm -rf /some/path/.*
удаляет все скрытые файлы в этом каталоге (но не в подкаталогах), а также выдает следующую ошибку / предупреждение:
rm: cannot remove directory: `/some/dir/.'
rm: cannot remove directory: `/some/dir/..'
Как правильно рекурсивно удалять все скрытые и не скрытые файлы и папки в целевом каталоге, не получая предупреждение / ошибка об .
и ..
?
rm ..?* .[!.]*
должен это сделать).*
соответствует всем не точечным файлам,.[!.]*
соответствует всем точечным файлам, за исключением.
файлов, имя которых начинается с..
, и..?*
соответствует всем точечным файлам, кроме..
. Вместе они соответствуют всем файлам, кроме.
и..
. Если какой-либо из этих трех шаблонов ничего не соответствует, он расширяется сам по себе;rm -f
не заботится о несуществующих аргументах, так что это не имеет значения.Вы также можете использовать
find
. Это сложнее, но имеет преимущество работы даже в том случае, если существует так много файлов, что указанные выше символы подстановки выходят за пределы длины командной строки вашей системы.Возможно, вам будет проще удалить и заново создать каталог. Это имеет преимущество (или недостаток, в зависимости от обстоятельств) в результате создания пустого каталога, даже если другая программа одновременно создает файлы в исходном каталоге.
источник
find
Альтернатива возвращает «успех» , даже если какой - то файл не был успешно удален; не подходит для сценария.find
команды, на странице поиска указано состояние «Поскольку -delete подразумевает -depth, вы не можете использовать -prune и -delete вместе». - вы еще используете-prune -delete
?-prune
ничего не делается. И после прочтения я вижу, что не правильно ответил на вопрос: я позаботился о том, чтобы не повторять, но вопрос явно требует рекурсивного удаления. Я исправил свой ответ..[^.]*
вместо.[!.]*
включения подстановки истории (что по умолчанию происходит в интерактивном режиме, но не в сценариях), потому что zsh анализирует!
как ссылку на историю. Но в zsh это вам не нужно, во-первых, вы можете просто использовать,*(D)
чтобы включить точечные файлы (без.
или..
) в совпадении с подстановочными знаками.Просто понял, что это самый удобный способ в большинстве дистрибутивов Linux:
где
-A
= перечислить все, кроме.
и..
-1
= положить каждый элемент в одну строкуисточник
ls -A1 /your/path/ | xargs rm -rf
следует подать заявкуЛибо измените
dotglob
опцию вашей оболочки и используйте*
, либо используйте что-то подобноеfind
.источник
rm -rf /some/dir
и затем создать новый пустой каталог на его месте.Это должно работать так же, как ответ @Gilles, но более компактно:
или же
Следует также добавить
if
для использования в сценариях просто для безопасности:источник
alias cleandir='rm -rf {,.[!.],..?}*'
не менее, делает.Найди твой друг.
Если вы хотите использовать рекурсивный поиск чего-то другого в вашем текущем каталоге ($ PWD), добавьте путь сразу после
find
команды; например,find /path ! -name '.' ! -name '..' -delete
. Если вы хотите только уменьшитьn
количество каталогов, используйте-maxdepth n
опцию сразу после/path
параметра.Вышеуказанная команда была протестирована в системе Ubuntu 13.04. Скорее всего, будет работать на других современных системах Linux.
источник
find . ! -name '.' ! -name '..' -type d -delete
Если предположить , что каталог в вопросе
./dir
, тоудалит все файлы
./dir
, включая скрытые файлы и каталоги, рекурсивно, включая сам./dir
каталог.Если вы не хотите удалять сам каталог, то вы можете просто восстановить его впоследствии или использовать
или если вы
find
не поддерживаете-delete
,Использование
-mindepth 1
позволяет вести каталог верхнего уровня./dir
.источник
Я предлагаю вам поэкспериментировать с
Turn- ON точек (скрытые файлы)
установлен
dotglob
shopt -s dotglob
Turn- OFF точки
снята с охраны
dotglob
shopt -u dotglob
Этот метод работал точно так, как я хотел для команды копирования , в которой отсутствовали скрытые каталоги.
Так что я сделал удалить (удалить), и упс ...
... это тоже работает!
Мне приходит в голову, что ваш дорогой читатель не может видеть
message_splitter
каталог. В любом случае у него есть.svn
папка, которую нужно удалить и скопировать в.Со
man
страницы ...Рекомендации:
источник
Попробуйте этот код:
источник