Удалить только файлы в каталоге на 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" на имя каталогов.
работал на миллионах файлов, не убивая процессор.