Всем привет! Подскажите пожалуйста как можно удалить все файлы в папке кроме перечисленных в файле? Сложность вот в чем:
Файл со списком (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
И так далее.
Удалить файлы не содержащиеся в списке
Двойной цикл
вспомогательная функция в списке boolean in_list(filename)
сканирует список файлов и проверяет, есть ли файл в списке.
Второй цикл - основной - по файлам в вашей папке.
Если in_list(filename) true, оставляем файл, в противном случае удаляем.
Двойной цикл
вспомогательная функция в списке boolean in_list(filename)
сканирует список файлов и проверяет, есть ли файл в списке.
Второй цикл - основной - по файлам в вашей папке.
Если in_list(filename) true, оставляем файл, в противном случае удаляем.
Я в баше и линуксе почти ноль :(
Я в баше и линуксе почти ноль
Я сам скрипты баша не очень знаю.
Могу написать на C или на Pascal.
C языка C скрипт можно будет адаптировать для bash.
А вот ссылка на bash-tutorial
https://linuxconfig.org/bash-scripting-tutorial-for-beginners
Добавьте имена файлов, которые вы хотите сохранить, в текстовый файл, по одному в строке. Этот файл не должен быть в каталоге, или вы должны добавить его имя тоже.
Если имя вашего каталога 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.
Это работает с именами файлов, содержащими пробелы.
Как то так.
Двойной цикл
Зачем? Можно использовать [console=inline]rm -f[/console], несуществующие файлы будут просто игнорироваться. Берём значение из списка, удаляем file_%ЗНАЧЕНИЕ%.* − так же проще.
Берём значение из списка, удаляем file_%ЗНАЧЕНИЕ%.* − так же проще.
В задаче условие, если в списке значит не трогаем... все остальное удаляем...
В задаче условие, если в списке значит не трогаем... все остальное удаляем...
А, прошу прощения, не так прочитал.