комната-rf все файлы и все скрытые файлы без. И.. ошибка

Короткий ответ: ограничения вводятся в ядре 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, закодировал символы.

86
22.04.2015, 17:53
11 ответов

Вы могли всегда отправлять сообщения об ошибках в /dev/null

rm -rf /some/path/.* 2> /dev/null

Вы могли также просто

rm -rf /some/path/
mkdir /some/path/

... затем Вы не должны будете беспокоиться скрытыми файлами во-первых.

41
27.01.2020, 19:30
  • 1
    Но что, если я только хочу удалить скрытые файлы? –  CMCDragonkai 01.06.2014, 16:52
  • 2
    @CMCDragonkai, который должен быть другим вопросом, но можно найти решение в ответе Gilles (rm ..?* .[!.]* должен сделать это). –  evilsoup 01.06.2014, 21:14
  • 3
    Не Делает удаления, и воссоздание каталога представляют угрозу, что полномочия файла не являются правильными впоследствии (особенно важный в серверных средах). Кто можно было создать папку с теми же полномочиями как прежде автоматически? –  Yo Ludke 23.09.2015, 11:46
  • 4
    @YoLudke Вы абсолютно корректны во многих ситуациях, он не имеет значения, но удаление папки и воссоздание, не семантически эквивалентен освобождению той папки; так будьте тщательным выполнением это! –  Thomas 29.12.2015, 07:43

* соответствия весь non-dot-files, .[!.]* соответствия все точечные файлы кроме . и файлы, имя которых начинается .., и ..?* соответствия все точечно-точечные файлы кроме ... Вместе они соответствуют всем файлам кроме . и ... Если какой-либо из этих трех шаблонов ничему не соответствует, это расширяется до себя; rm -f не заботится о несуществующих аргументах, таким образом, это не имеет значения.

rm -rf ..?* .[!.]* *

Можно также использовать find. Это более сложно, но имеет преимущество работы, даже если бы существует столько файлов, которые подстановочные знаки выше развернули бы вне предела длины командной строки Вашей системы.

find . -name . -o -prune -exec rm -rf -- {} +

Можно найти более ясным удалить и воссоздать каталог. Это имеет преимущество (или оборотная сторона, в зависимости от обстоятельств) приведения к пустому каталогу, даже если другая программа одновременно создает файлы в исходном каталоге.

86
27.01.2020, 19:30
  • 1
    Это должно быть принятым ответом, поскольку он предотвращает родительское пересекающееся и возможное удаление. –  rbellamy 12.06.2015, 20:06
  • 2
    find альтернатива возвращает "успех", даже если некоторый файл успешно не удален; не хороший для сценария. –  Franklin Yu 29.07.2016, 10:22
  • 3
    Относительно Вашей секунды find команда, страница справочника для состояний находки, "Поскольку - удаляют, подразумевают - глубина, Вы не можете полезно использовать - чернослив и - удаляет вместе". - все же Вы используете -prune -delete? –  Doktor J 19.08.2016, 00:29
  • 4
    @DoktorJ Действительно, -prune ничего не делает здесь. И при чтении назад я вижу, что не отвечал на вопрос правильно: Я заботился для не рекурсивного вызова, но вопрос явно просит рекурсивное удаление. Я исправил свой ответ. –  Gilles 'SO- stop being evil' 19.08.2016, 00:53
  • 5
    @haylem В zsh, необходимо записать .[^.]* вместо .[!.]* когда замена истории включена (который по умолчанию имеет место в интерактивном режиме, но не в сценариях), потому что 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.

3
27.01.2020, 19:30
  • 1
    для удаления всех каталогов в текущем каталоге Вы могли сделать find . ! -name '.' ! -name '..' -type d -delete –  Andy 03.07.2016, 07:01

Любое изменение dotglob опция Вашей оболочки и использования *, или используйте что-то как find.

find somedir -mindepth 1 -delete
15
27.01.2020, 19:30
  • 1
    Или Вы могли просто 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
-2
27.01.2020, 19:30

Только что понял, что это наиболее удобный способ для большинства дистрибутивов Linux:

ls -A1 | xargs rm -rf

где

-A = перечислить все кроме . и ..

-1 = поместить каждый элемент в одну строку

22
27.01.2020, 19:30

Это должно работать так же, как ответ @Gilles, но более компактно:

rm -rf {,.[!.],..?}*

или

rm -rf dir/to/files/{,.[!.],..?}*

также следует добавить if для использования в скриптах на всякий случай:

if [ -d "$DIR" ]; then
    rm -rf ${DIR}/{,.[!.],..?}*
fi
9
27.01.2020, 19:30

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.

4
27.01.2020, 19:30

Если вас не смущает ошибка

# 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
-1
27.01.2020, 19:30

Вы можете попробовать

rm -rf /some/path/*.*
0
27.01.2020, 19:30

Почему никто не упоминает:

rm -rf *.*
1
10.04.2020, 08:34

Теги

Похожие вопросы