Удалите все файлы, кроме нескольких, из папки в Unix [дубликат]


2

Возможное дублирование:
Как удалить все файлы в каталоге, кроме некоторых?

Я часто сталкиваюсь с этой проблемой. У меня есть набор файлов в папке, и я хотел бы удалить все из них, кроме нескольких.

Например: у меня есть файлы с именами в соответствии с датой создания (например, 11-1-11.tar, 10-1-11.tar и т. Д.). Теперь я хотел бы удалить файлы, такие как 10-1-11, 9-1-11 и так далее, но не некоторые другие файлы. В основном я хотел бы обеспечить, что все должно быть удалено и что следует сохранить. Как бы я это сделал?

Ответы:


3

Если это BASH, вы можете использовать расширенную глобализацию. Включить:

shopt -s extglob

(Вставьте это в свой, .bashrcесли хотите, или просто включите, когда вам это нужно.)

А затем, например, удалить все файлы, кроме filename1 и filename2

rm !(filename1|filename2)

Вы также можете использовать подстановочные знаки, такие как *.

Или вы можете удалить все те, которые соответствуют шаблону:

rm +([0-9])-+([0-9])-+([0-9]).tar

удалит все # - # - #. tar-файлы (где числа имеют 1 или более цифр).

Неясно, будет ли это соответствовать вашим потребностям или нет. Подробнее здесь .


2

Если имя файла соответствует дате создания файла, может быть проще удалить файлы старше определенного дня.

Это легко достигается с помощью команды find:

find / home / john / files -type f -mtime +30 -delete

это приведет к удалению файлов, для /home/john/filesкоторых дата модификации более 30 дней назад.



0

Я думаю, вы можете использовать несколько команд UNIX в одном канале, и это решит вашу проблему. Одним из возможных решений является использование find | grep | xargs rm -rf. Например:

$ find /path/to/directory/tree -type f | grep -v -E -f /path/to/exclude/file | xargs rm -rf

Для исключения некоторых файлов просто поместите их имена в файл /path/to/exclude/file. Например:

very_useful_file.tar.gz
very_important_file.jpg

Для предотвращения некорректного стирания важных файлов предлагаю сделать резервную копию всех файлов. Также полезно использовать xargs с -pопцией, которая...Prompt the user about whether to run each command line and read a line from the terminal.

Можно использовать findинструмент без grep / xargs. Это будет что-то вроде этого: find /path/to/tree -type f ! -name "exlude_pattern"

Перед использованием этих команд внимательно прочитайте справочные страницы find/grep/xargs! Они могут быть очень опасными :).


Возможно, вы также захотите тщательно продумать, хотите ли вы использовать -r(рекурсивный) (и, возможно, -f(принудительный)) при передаче имен файлов для xargsfor rm.
Деннис Уильямсон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.