2009-08-14 4 views
21

Я пытаюсь сделать то, что, вероятно, очень просто, у меня есть структура каталогов, таких как:Удалить все файлы, но сохранить все каталоги в сценарии bash?

dir/ 
    subdir1/ 
    subdir2/ 
     file1 
     file2 
     subsubdir1/ 
      file3 

Я хотел бы выполнить команду в Баш скрипт, который будет удалять все файлы рекурсивно из реж на вниз, но оставьте все каталоги. То есть:

dir/ 
    subdir1/ 
    subdir2/ 
     subsubdir1 

Что было бы подходящей для этого команды?

+0

Выглядит как суперпользователь вопрос ко мне, вы не думаете? –

+4

Нет, я пишу скрипт bash, это программирование, и на этом сайте есть много вопросов по сценарию bash :-) – Grundlefleck

+4

shell scripting считается как программирование, на мой взгляд –

ответ

38
find dir -type f -print0 | xargs -0 rm 

find список всех файлы, которые соответствуют определенному выражению в заданной директории, рекурсивно. -type f соответствует обычным файлам. -print0 предназначен для печати имен с использованием \0 в качестве разделителя (как и любой другой символ, включая \n, может быть в виде пути). xargs предназначен для сбора имен файлов со стандартного ввода и помещения их в качестве параметров. -0 должен убедиться, что xargs поймет разделитель \0.

xargs достаточно разумно позвонить по телефону rm несколько раз, если список параметров станет слишком большим. Так что это намного лучше, чем пытаться вызвать sth. подобный rm $((find ...). Также он намного быстрее, чем вызов rm для каждого файла сам по себе, например find ... -exec rm \{\}.

+0

+1, проверено как хорошо :-) – Grundlefleck

+0

+1 для обработки пробелов и других «неожиданных» символов в именах файлов. – chepner

8
find dir -type f -exec rm {} \; 

где реж это верхний уровень, где вы хотите удалить файлы из

Обратите внимание, что это будет только удалить обычные файлы, а не символические ссылки, а не устройство, и т.д. Если вы хотите, чтобы удалить все кроме каталогов, используйте

find dir -not -type d -exec rm {} \; 
+0

+1, проверено как хорошее :) – Grundlefleck

+0

+1. Я добавил цитаты, потому что они необходимы при обработке имен файлов, содержащих пробелы. – Stephan202

+0

@ Stephan202 Это неверно. '' {} ''совпадает с' {} 'в отношении оболочки, а' find' видит только '{}', поскольку оболочка удаляет кавычки перед передачей аргументов командной строки 'find'. –

8
find dir -type f -exec rm '{}' + 
+1

Что такое «+»? – Grundlefleck

+3

Команда '-exec' может быть прервана двумя способами: с точкой с запятой или плюсом. Если вы используете точку с запятой, то для каждого файла создается новый процесс.Если вы используете знак плюса, то генерируется только один процесс. (Ну, на самом деле, если командная строка слишком длинная, то возникает несколько процессов - в основном, она работает как «xargs», но без всех проблем с кавычками.) Скажем, у вас есть два файла, называемые A и B. Затем, с точкой с запятой два процесса будут порождены: 'rm A' и' rm B'. С плюсом генерируется только один процесс: 'rm A B'. –

9

с ГНУ find вы можете использовать -delete действия:

find dir -type f -delete 

Со стандартным find вы можете использовать -exec rm:

find dir -type f -exec rm {} + 
+0

+1 для флага -delete :) – Christoffer

Смежные вопросы