Подтвердить что ты не робот

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

Можно выполнить команду удаления для удаления только файлов в заданной директории

  • НЕ каталоги
  • НЕ подкаталоги
  • НЕ файлы в этих подкаталогах.

В некоторых файлах нет расширений, поэтому rm *.* не работает...

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

Любые советы?

4b9b3361

Ответ 1

Что для меня работало, это PERL script:

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

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

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

Ответ 2

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

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

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

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

Ответ 3

find PATH -type f -maxdepth 1 -delete

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

Ответ 4

Поскольку это связано с поиском google, самый простой ответ:

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" в каждой папке (X - это уровень каталога). rm 1/2/* удаляет hello2.txt и оставляет другую структуру неповрежденной.

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

Просто пример Makefile, который очищает tmp-каталог cakephp и оставляет структуру каталога неповрежденной:

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

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

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

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

Ответ 5

TL; DR:

find . -maxdepth 1 -type f -delete

Etc:

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

find . -type f -maxdepth 1 -delete

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

Ответ 6

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

rm *

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Изменить: это по сути то же самое, что и Джеймс, но я не видел его сообщения до тех пор, пока