Удалить только файлы в каталоге на linux не каталоги

какую команду delete можно запустить, чтобы удалить только файлы в данном каталоге

  • не директории
  • не подкаталогов
  • не файлы в этих поддиректориях.

некоторые файлы не имеют расширения, так rm *.* не будет работать...

в этой папке тысячи файлов.

какие-либо советы?

9 ответов


можно использовать find С -type f только для файлов и -maxdepth 1 так find не будет искать файлы в подкаталогах /path/to/directory. rm -i предложит вам при каждом удалении, чтобы вы могли подтвердить или отклонить удаление. Если вы не заботитесь о подтверждении каждого удаления, измените его на rm -fv (-f на силу удалить). The -v флаг делает это так, что с каждым удалением печатается сообщение о том, какой файл был просто удаленный.

find /path/to/directory -maxdepth 1 -type f -exec rm -iv {} \;

это должно соответствовать критериям:

не директории
Не подкаталоги
Не файлы в этих подкаталогах.


find PATH -type f -maxdepth 1 -delete

но это не будет запрашивать подтверждение или выводить то, что он только что удалил. Поэтому лучше всего запустить его без действия-delete и проверить, что это правильные файлы.


так как это высоко на Google search, самый простой ответ:

rm $directoryPath/*

где $directoryPath-это каталог, который вы хотите очистить. Кредиты должны идти на cbm3384 (который по какой-то причине получил отрицательные голоса за этот ответ, почему?)

если вы не хотите подтверждать:

rm -f $directoryPath/*

если вы не верите, попробуйте man rm или

mkdir -p 1/2/3; echo 'hello1' > 1/hello1.txt; echo 'hello2' > 1/2/hello2.txt;echo 'hello3' > 1/2/3/hello3.txt
rm 1/2/*

выше создает структуру каталогов, которая имеет helloX.файл txt в каждой папке (х уровень каталогов.) rm 1/2/* удалить hello2.txt и оставляет другую структуру неповрежденной.

и rm */*/* удаляет только hello2.txt. Это единственное, что соответствует шаблону.

просто пример файла Makefile, который очищает CakePHP tmp-directory и оставляет структуру каталогов нетронутой:

clean:
    -rm -f tmp/*
    -rm -f tmp/*/*
    -rm -f tmp/*/*/*
    -rm -f tmp/*/*/*/*

минус перед rm означает "не стой над ошибками" (каталог неснятую возвращает ошибку). Если вы хотите сохранить какой-то уровень, просто удалите эту строку, например, вторая строка rm удаляет журналы.

Дайте мне знать, если у вас есть система, которая делает что-то еще (БСД?).

EDIT: я тестировал это на ubuntu 12.04, osx lion и sourceforge.net Шелл. Все ведут себя так, как описано выше.


rm не удалять каталоги по умолчанию. Итак, в вашем примере,предполагая, что вы находитесь в Родительском каталоге и все файлы, все что вам нужно это:

rm *

TL; DR:

find . -maxdepth 1 -type f -delete

Etc:

не большое дело, но предложения выше не сработали для меня, потому что...

find . -type f -maxdepth 1 -delete

find: warning: вы указали параметр-maxdepth после типа аргумента non-option, но параметры не являются позиционными (- maxdepth влияет на тесты, указанные перед ним, а также те, которые указаны после него). Пожалуйста, укажите параметры перед другими аргументами.


rm dirname/*? Без -f он не будет принудительно удалять, без -r он не будет рекурсировать и удалять каталоги, а также файлы.


rm-f dirname/* удаляет только файлы без запроса для каждого файла. Он также отобразит "cannnot remove 'subdirname': is a directory" для каждого подкаталога.


для этого я бы использовал find с максимальной глубиной 1, а затем exec rm со списком файлов.

find ./dir -maxdepth 1 -type f -exec rm -rf '{}' \;

Edit: это по существу то же самое, что и Джеймс, но я не видел его сообщение до


то, что сработало для меня, - это скрипт PERL:

perl -e 'chdir "subdirectory_name" or die; opendir D, "."; while ($n = readdir D) { unlink $n }'

запустите этот уровень из каталога, который вы хотите очистить: замените "subdirectory_name" на имя каталогов.

работал на миллионах файлов, не убивая процессор.