Это правильный способ очистки текущего каталога, верно?
rm -r * .
Нет, и по нескольким причинам: 1) эта команда попытается удалить .
, который является текущим каталогом, и, таким образом, потерпит неудачу; 2) эта команда не удалит "скрытые" файлы, начинающиеся с символа «.» персонаж; 3) команда не удалит каталоги.
Вы можете использовать rm -rf *
. Это удалит все файлы и каталоги, но не удалит точечные файлы. Вы можете использовать find . -type f | xargs rm
удалит все файлы, включая скрытые, но это не удалит каталоги.
Итак, вы можете использовать это:
$ find . -print0 -type f -o -type d -not -name '\.' | xargs -0 rm -rf
Здесь вы рекурсивно находите все файлы и каталоги (если они не называются «.»), А затем удаляете их. -print0
и -0
позволяют ему правильно обрабатывать имена файлов с пробелами в их именах.
Обычно я просто перемещаюсь на один уровень вверх по иерархии, затем удаляю каталог по имени и воссоздаю его:
cd ..
rm -rf dirname
mkdir dirname
cd dirname
потому что это исключает ошибку при использовании rm -rf *
в неправильном каталоге.
Примечание. Если каталог имеет нестандартные разрешения или принадлежит какой-либо другой учетной записи, вы потеряете его при удалении и повторном создании каталога. Это не то, что возникает у меня очень часто, но стоит задуматься.
Если бы мне нужно было сделать это в сценарии, я бы, вероятно, создал функцию, которая сохраняет текущий каталог, перемещает его на уровень вверх, удаляет и создает новый пустой каталог и перемещает его туда.
Одно простое решение, если вы не хотите использовать find, - это удалить текущий каталог, а затем воссоздать его:
rm -rf "`pwd`" && mkdir "`pwd`" && cd "`pwd`"
Если вы используете bash (версия 4 или выше), вы можете использовать опцию оболочки dotglob
чтобы включить имена файлов, начинающиеся с точки, в вашем глобе.
shopt -s dotglob
rm -r -- *
Вышеприведенное будет разбито на каталоги, содержащие много сотен тысяч файлов; в этом случае вы можете использовать printf
(который, будучи встроенным в bash, смеется перед лицом ARG_MAX ) и xargs
(который предоставит rm
безопасное количество аргументов).
shopt -s dotglob
printf '%q ' * | xargs rm -r --
Вы можете dotglob
только закончите с:
shopt -u dotglob
Другой способ сделать это без возни с опциями оболочки:
rm -r -- * .[^.]* ..?*
## or
printf '%q ' * .[^.]* ..?* | xargs rm -r --
Первый глоб *
будет соответствовать всему текущему каталогу, который не начинается с точки; второй .[^.]*
соответствует всему, что начинается с точки, за которой следует один не точечный символ, за которым следует любое количество других символов; третий шар соответствует двум точкам, за которыми следует любой один символ, за которым следует любое количество других символов. Это может быть полезно, если вы застряли в оболочке без опции dotglob; однако в таком случае printf
может не быть встроенной оболочкой или может не иметь флага %q
(который заключает в кавычки все пробелы и необычные символы в передаваемых ему аргументах, что делает их безопасными для передачи в xargs
), поэтому вам, вероятно, следует в этом случае используйте одно из решений на основе find
.