Это правильный способ очистки текущего каталога, верно?
rm -r * .
Обычно я просто перемещаюсь на один уровень вверх по иерархии, затем удаляю каталог по имени и воссоздаю его:
cd ..
rm -rf dirname
mkdir dirname
cd dirname
потому что это устраняет ошибку в случае использования rm -rf *
в неправильном каталоге.
Замечания: Если каталог имеет нестандартные разрешения или принадлежит какой-либо другой учетной записи, вы потеряете его при удалении и повторном создании каталога. Это не то, что возникает у меня очень часто, но стоит задуматься.
Если бы мне нужно было сделать это в сценарии, я бы, вероятно, сделал функцию, которая сохраняет текущий каталог, перемещает его на уровень вверх, удаляет и создает новый пустой каталог и перемещает туда.
rm *
может расшириться до большего. Воссоздание директории ИМХО - лучший вариант (если у вас нет жестких ссылок, но это просто грязно).Нет, и по нескольким причинам: 1) эта команда попытается удалить
.
, который является текущим каталогом, и, таким образом, потерпит неудачу; 2) эта команда не удалит «скрытые» файлы, начинающиеся с символа «.» персонаж; 3) команда не удалит каталоги.Вы могли бы использовать
rm -rf *
, Это удалит все файлы и каталоги, но не удалит точечные файлы. Вы могли бы использоватьfind . -type f | xargs rm
удалить все файлы, включая скрытые, но это не приведет к удалению каталогов.Итак, вы можете использовать это:
Здесь вы рекурсивно находите все файлы и каталоги (если они не называются «.»), А затем удаляете их.
-print0
а также-0
аргументы позволяют ему правильно обрабатывать имена файлов с пробелами в их именах.источник
-print0
сfind
а также-0
сxargs
,rm --recursive * .*[^.]*
на Linux, и было интересно, будет ли это работать на Unix.rm
Команда удалит все не-точечные файлы и все точечные файлы, которые содержат хотя бы один не-точечный символ. Пытатьсяtouch ...
(да, три периода), затем запустить его.touch ...
действительно создает скрытый файл с именем...
в линуксеВы можете сделать это, если доступны ключи -mindepth и -delete:
Если вы хотите придерживаться POSIX , вы можете сделать это (как видно на unix.com ):
источник
Одно простое решение, если вы не хотите использовать find, - это удалить текущий каталог, а затем воссоздать его:
источник
pwd
, Я не уверен, будет ли это работать правильно после удаления._dir=$(pwd) ; rm -rf "$_dir" && ...
, Хотя не проверял, так что я могу ошибаться.Если вы используете bash (версия 4 или выше), вы можете использовать
dotglob
опция оболочки, чтобы включить имена файлов, начинающиеся с точки в вашем глобусе.Вышеприведенное будет разбито на каталоги, содержащие много сотен тысяч файлов; в этом случае вы можете использовать
printf
(который, будучи встроенным в Bash, смеется в лице ARG_MAX ) а такжеxargs
(который предоставит безопасное количество аргументовrm
).Вы можете сбросить
dotglob
как только вы закончите с:Другой способ сделать это без возни с опциями оболочки:
Первый шар
*
будет соответствовать всему в текущем каталоге, который не начинается с точки; второй.[^.]*
соответствует всему, что начинается с точки, за которой следует один не точечный символ, за которым следует любое количество других символов; третий шар соответствует двум точкам, за которыми следует любой один символ, за которым следует любое количество других символов. Это может быть полезно, если вы застряли в оболочке без опции dotglob; однако в таком случаеprintf
может не быть встроенной оболочкой или может не иметь%q
флаг (который цитирует все пробелы и необычные символы в переданных ему аргументах, делая их безопасными для передачиxargs
), так что вы, вероятно, должны использовать один изfind
решения в таком случае.источник