Короткий ответ: ограничения вводятся в ядре Unix/Linux/BSD, namei()
функция. Кодирование происходит в программах уровня пользователя как xterm
, firefox
или ls
.
Я думаю, что Вы запускаете с неправильного помещения. Имя файла в Unix является строкой байтов с произвольными значениями. Несколько значений, 0x0 (ASCII Nul) и 0x2f (ASCII '/') просто не позволяются, не как часть многобайтовой кодировки символов, не как ничто. "Байт" может содержать число, представляющее символ (в ASCII и некоторой другой кодировке), но "символ" может потребовать больше чем 1 байта (например, кодовые точки выше 0x7f в представлении UTF-8 Unicode).
Эти ограничения являются результатом конвенций печати имени файла и набора символов ASCII. Исходный Unixes использовал ASCII '/' (численно 0x2f) оцененные байты для разделения частей частично - или полностью определенный путь (как '/usr/bin/cat' имеет части "usr", "мусорное ведро" и "кошку"). Исходный Unixes использовал ASCII Nul для завершения строк. Кроме тех двух значений, байты в именах файлов могут принять любое другое значение. Вы видите эхо этого в кодировке UTF-8 для Unicode. Печатаемые символы ASCII, включая '/', берут только один байт в UTF-8. UTF-8 для кодовых точек выше не включает байтов с нулевым знаком, за исключением управляющего символа Nul. UTF-8 был изобретен для Плана 9, Претендента на Трон Unix.
Более старый Unixes (и это похоже на Linux), имел a namei()
функция, которая просто смотрит на пути байт за один раз и ломает пути на кусочки в 0x2F, оценила байты, останавливающиеся на уровне байта с нулевым знаком. namei()
часть ядра Unix/Linux/BSD, таким образом, это - то, где исключительные значения байта осуществляются.
Заметьте, что до сих пор, я говорил о значениях байта, не символах. namei()
не осуществляет символьной семантики на байтах. Это до программ уровня пользователя, как ls
, который мог бы отсортировать имена файлов на основе значений байта или символьных значений. xterm
решает что пиксели осветить для имен файлов на основе кодировки символов. Если Вы не говорите xterm
у Вас есть закодированные имена файлов UTF-8, Вы будете видеть много мусора при вызове его. Если vim
не компилируется для обнаружения UTF-8 (или что бы то ни было, UTF-16, UTF-32) кодировка, Вы будете видеть много мусора, когда Вы откроетесь, "текстовый файл", содержащий UTF-8, закодировал символы.
Вы могли всегда отправлять сообщения об ошибках в /dev/null
rm -rf /some/path/.* 2> /dev/null
Вы могли также просто
rm -rf /some/path/
mkdir /some/path/
... затем Вы не должны будете беспокоиться скрытыми файлами во-первых.
*
соответствия весь non-dot-files, .[!.]*
соответствия все точечные файлы кроме .
и файлы, имя которых начинается ..
, и ..?*
соответствия все точечно-точечные файлы кроме ..
. Вместе они соответствуют всем файлам кроме .
и ..
. Если какой-либо из этих трех шаблонов ничему не соответствует, это расширяется до себя; rm -f
не заботится о несуществующих аргументах, таким образом, это не имеет значения.
rm -rf ..?* .[!.]* *
Можно также использовать find
. Это более сложно, но имеет преимущество работы, даже если бы существует столько файлов, которые подстановочные знаки выше развернули бы вне предела длины командной строки Вашей системы.
find . -name . -o -prune -exec rm -rf -- {} +
Можно найти более ясным удалить и воссоздать каталог. Это имеет преимущество (или оборотная сторона, в зависимости от обстоятельств) приведения к пустому каталогу, даже если другая программа одновременно создает файлы в исходном каталоге.
find
альтернатива возвращает "успех", даже если некоторый файл успешно не удален; не хороший для сценария.
– Franklin Yu
29.07.2016, 10:22
find
команда, страница справочника для состояний находки, "Поскольку - удаляют, подразумевают - глубина, Вы не можете полезно использовать - чернослив и - удаляет вместе". - все же Вы используете -prune -delete
?
– Doktor J
19.08.2016, 00:29
-prune
ничего не делает здесь. И при чтении назад я вижу, что не отвечал на вопрос правильно: Я заботился для не рекурсивного вызова, но вопрос явно просит рекурсивное удаление. Я исправил свой ответ.
– Gilles 'SO- stop being evil'
19.08.2016, 00:53
.[^.]*
вместо .[!.]*
когда замена истории включена (который по умолчанию имеет место в интерактивном режиме, но не в сценариях), потому что zsh анализирует !
как ссылка истории. Но в zsh Вам не было бы нужно это во-первых, можно просто использовать *(D)
включать точечные файлы (без .
или ..
) в подстановочном соответствии.
– Gilles 'SO- stop being evil'
01.08.2017, 17:29
Находка является Вашим другом.
find ! -name '.' ! -name '..' -delete
% find ! -name '.' ! -name '..'
./test
./test4
./test4/.test6
./test3
./.test5
./test2
% find ! -name '.' ! -name '..' -delete
% find ! -name '.' ! -name '..'
%
Если Вы хотите использовать рекурсивно поиск что-то другое Ваш текущий каталог ($PWD), то добавьте путь прямо после find
команда; например, find /path ! -name '.' ! -name '..' -delete
. Если Вы только хотите убывать n
количество каталогов, затем используйте -maxdepth n
опция прямо после /path
параметр.
Вышеупомянутая команда была протестирована в системе Ubuntu 13.04. Будет, вероятно, работать над другим, современными системами Linux.
find . ! -name '.' ! -name '..' -type d -delete
– Andy
03.07.2016, 07:01
Любое изменение dotglob
опция Вашей оболочки и использования *
, или используйте что-то как find
.
find somedir -mindepth 1 -delete
rm -rf /some/dir
и затем создайте новый пустой каталог в его месте.
– tripleee
26.05.2013, 15:11
Попробуйте этот код:
Dirlist=``find /some/path/ -type d -name '.[^.]*'`
for HiddenDir in $Dirlist
do
rm -rf $HiddenDir
done
Только что понял, что это наиболее удобный способ для большинства дистрибутивов Linux:
ls -A1 | xargs rm -rf
где
-A
= перечислить все кроме .
и ..
-1
= поместить каждый элемент в одну строку
Это должно работать так же, как ответ @Gilles, но более компактно:
rm -rf {,.[!.],..?}*
или
rm -rf dir/to/files/{,.[!.],..?}*
также следует добавить if
для использования в скриптах на всякий случай:
if [ -d "$DIR" ]; then
rm -rf ${DIR}/{,.[!.],..?}*
fi
What is the proper way to remove all hidden and non-hidden files and folders recursively in a target directory without receiving the warning/error about. and..?
Предположим, что речь идет о каталоге ./dir
, тогда
rm -rf./dir
удалит все файлы в ./dir
, включая скрытые файлы и каталоги, рекурсивно, включая сам каталог ./dir
.
Если вы не хотите удалять сам каталог, вы можете просто создать его заново или использовать
find./dir -mindepth 1 -delete
или если вы find
не поддерживаете -delete
,
find./dir -mindepth 1 -depth -exec rm -rf {} ';'
Использование -mindepth 1
позволяет сохранить каталог верхнего -уровня ./dir
.
Если вас не смущает ошибка
# rm -rf will force remove a file $(ls -la) lists all files and allows rm to iterate over the results.
rm -rf $(ls -la)
или 2> /dev/null подавляет ошибку, возникающую при удалении...
rm -rf $(ls -la) 2> /dev/null
rm ..?* .[!.]*
должен сделать это). – evilsoup 01.06.2014, 21:14