LinuxForum.Fans
Тема

Удалить файлы не содержащиеся в списке

Автор: iwizard7 8 сообщений 1288 просмотров
10.06.2021 18:52 #436434

Всем привет! Подскажите пожалуйста как можно удалить все файлы в папке кроме перечисленных в файле? Сложность вот в чем:
Файл со списком (list.txt) содержит в себе список в таком формате:
33245
2415
34222
6688
306302
534

Имена файлов в папке вот в таком формате:
file_33245.0
file_2415.0
file_2415.1
file_34222.0
file_6688.0
file_306302.0
file_534.0
file_287612.0
file_287612.1
И так далее.

10.06.2021 19:32 · отредактировано #436435

Двойной цикл
вспомогательная функция в списке boolean in_list(filename)
сканирует список файлов и проверяет, есть ли файл в списке.
Второй цикл - основной - по файлам в вашей папке.
Если in_list(filename) true, оставляем файл, в противном случае удаляем.

10.06.2021 19:36 #436436
ValentinK написал:
Двойной цикл
вспомогательная функция в списке boolean in_list(filename)
сканирует список файлов и проверяет, есть ли файл в списке.
Второй цикл - основной - по файлам в вашей папке.
Если in_list(filename) true, оставляем файл, в противном случае удаляем.

Я в баше и линуксе почти ноль :(

10.06.2021 19:46 · отредактировано #436437
"iwizard7" написал:
Я в баше и линуксе почти ноль

Я сам скрипты баша не очень знаю.
Могу написать на C или на Pascal.
C языка C скрипт можно будет адаптировать для bash.

А вот ссылка на bash-tutorial
https://linuxconfig.org/bash-scripting-tutorial-for-beginners

10.06.2021 20:47 #436438

Добавьте имена файлов, которые вы хотите сохранить, в текстовый файл, по одному в строке. Этот файл не должен быть в каталоге, или вы должны добавить его имя тоже.

Если имя вашего каталога katalog, а имя файла - list.txt , сделайте следующее.

[console]find katalog -type f -print0|grep -vzZ -f list.txt|xargs -0 rm[/console]
Это делает следующее:

find -type fищет имена всех файлов в katalog и его подкаталогах и печатает их в STDOUT. С опцией -print0 он разделяет имена файлов с байтами NUL.
grep -v -f list.txt исключает все имена файлов, которые соответствуют строке в строке . С опцией -z он обрабатывает свои входные данные как набор строк, разделенных байтом NUL, с опцией -Z он ограничивает свой вывод байтом NUL.
xargs rm звонит rm несколько раз, чтобы удалить файлы. С параметром -0 он обрабатывает свой ввод как набор строк, разделенных байтом NUL.
Это работает с именами файлов, содержащими пробелы.

Как то так.

10.06.2021 20:50 #436439
"ValentinK" написал:
Двойной цикл

Зачем? Можно использовать [console=inline]rm -f[/console], несуществующие файлы будут просто игнорироваться. Берём значение из списка, удаляем file_%ЗНАЧЕНИЕ%.* − так же проще.

10.06.2021 20:52 #436440
"Rizado" написал:
Берём значение из списка, удаляем file_%ЗНАЧЕНИЕ%.* − так же проще.

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

10.06.2021 20:53 #436441
"MozgFx" написал:
В задаче условие, если в списке значит не трогаем... все остальное удаляем...

А, прошу прощения, не так прочитал.

Войдите или зарегистрируйтесь, чтобы ответить.