Поиск и удаление файлов по списку.

Подшамалил, что делал на скорую руку, в итоге получился всего один скритп - преобразуем список не полными именами в полные.
cat ~/test.sh
#!/bin/bash
 cd /
 cat ~/list.txt | while IFS= read line
     do
           sh -c  'find  `pwd` -name  '$line' 2> /dev/null >> ~/list2.txt'
     done
 exit 0
Его работа (использовал файл list.txt - приведен выше) … понимает и пробелы в имени
cat ~/list2.txt
/home/vasek/Документы/Config_/pacman_/pacman.conf
/etc/pacman.conf
/home/vasek/Документы/Grub/INFO_structure/grub-2.02_скомпилированный/docs/grub.cfg
/home/vasek/Документы/Grub/INFO_structure/grub_git/docs/grub.cfg
/home/vasek/Документы/Флеш/loopback_cfg/uberimg/grub.cfg
/home/vasek/Документы/Флеш/Загрузочные/Мультизагрузочные с Grub2/Копии_файлов_из_флэш/grub.cfg
/home/vasek/Документы/Флеш/Grub4Dos_soft_doc_file/File/EFI/boot/grub.cfg
/home/vasek/Документы/Флеш/Grub4Dos_soft_doc_file/File_new/EFI/boot/grub.cfg
/boot/grub/grub.cfg

PS - вместо `pwd` можно прописывать и $PWD или $(pwd) - но есть нюансы.
Ошибки не исчезают с опытом - они просто умнеют
Извиняюсь за долгое молчание, был вдали от инета.

cucullus
всё таки не понятно ТЗ.
Есть каталог, в нем лежит скрипт, который по определенному алгоритму находит имена файлов, которые надо удалить. Файлы могут лежать в произвольном количестве каталогов с разной глубиной вложенности и разными названиями, файлы могут дублироваться. Но все это барахло (набор других каталогов) всегда лежит в том же каталоге, что и мой скрипт. Т.е. скрипт никогда не ведет поиск только в собственном каталоге и во вложенных.
По итогам работы скрипта создается список файлов, которые требуется удалять. Как я уже писал, файлы могут дублироваться, поэтому в список добавляются только имена файлов, без полных путей. В списке они сортируются и удаляются дубликаты имен. Добавлять файлы в список с полными путями нельзя по некоторым причинам, которые описывать долго, поэтому остановимся на том, что просто нельзя.
Нужно добавить в скрипт код, который будет брать файл со списком, читать из него по очереди названия файлов, искать все файлы с указанными именами и удалять их автоматически.
Я не знаток баша, скриптинга и т.д., поэтому не получается самому правильно составить конструкцию, которая бы выполняла мои требования. Примерно так.
grayich
vadik, пиши в файл полные пути просто
или сразу удаляй

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

vs220
а так?

cat "/путь/file_name.txt" |xargs -I _ find "/путь _к_каталогу_где_искать" -type f -name '_' -delete
Попробовал, получил забавный эффект. Ощущение, что команды cat и xargs работают параллельно, потому что find в своем выводе пишет "/путь _к_катпуть/file_name.txt_где_ипуть/file_name.txtь"
Т.е. имя файла вставляется прямо в путь, причем два раза и прямо в название каталога. Естественно далее ничего не ищется и не удаляется.
vadik
Естественно далее ничего не ищется и не удаляется.
Я попробовал у себя запускать отработало нормально на списке типо
1
что то 2
3_test
где каждая строчка имя файла

Список file_name.txt какой вид имеет?
vs220
Я попробовал у себя запускать отработало нормально на списке типо
Вы запускали из скрипта или из командной строки? Я из скрипта.
В моем файле каждое имя с расширением записано в отдельной строчке. Без пробелов и спецсимволов. Только английские буквы и цифры. Типа jdsk105s5fdsgvbs.txt.
.
.
.

vasek
Подшамалил, что делал на скорую руку, в итоге получился всего один скритп - преобразуем список не полными именами в полные.
cat ~/test.sh
Почти то, что нужно, но есть нюанс. Для удаления файлов я добавил строку

cat /tmp/del.tmp | xargs rm -rv
Но после exit 0 скрипт заканчивает работу и дальнейшие операции не выполняются.
Если перенести exit 0 после cat /tmp/del.tmp | xargs rm -rv, скрипт пытается удалять файлы два раза. Первый раз удаляет нормально, второй раз пытается удалить уже удаленные файлы и сыпет в консоль ошибки. Хотелось бы поправить.
vadik
запускали из скрипта или из командной строки?
из командной строки

из скрипта вида
#!/bin/bash
 cat "/home/oleg/Рабочий стол/test/file_name.txt" |xargs -I _ find "/home/oleg/Рабочий стол/test" -type f -name '_' -delete
тоже нормально
проверьте без -delete
должно вывести все пути к файлам
vadik
Для удаления файлов я добавил строку
cat /tmp/del.tmp | xargs rm -rv
Так не нужно ... лучше запустить удаление отдельно, проверив полученный файл ... так надежнее.
Конечно, можно все в одном скрипте, но тогда лучше вместо создания файла с полными именами прописать удаление файлов ....
На досуге посмотрю ... но лично для меня спокойнее удаление оставить одельно.

Так и не понял - скрипт работает нормально? ... если что то менять, то нужно удостовериться, что все работает нормально.
Ошибки не исчезают с опытом - они просто умнеют
vs220, Честно - фиг его знает. Я специально создал один тестовый файл для удаления и find вывел точно такую же мешанину вместо пути. Уровень вложености - 7 каталогов. Абракадабра начинается с 5-го по счету каталога. Ради интереса попробую подвинуть.

П.С. Уже и скрипт от vasek не работает.
sh: 1: Syntax error: "(" unexpected
Жесть какая-то.
vasek
Так не нужно … лучше запустить удаление отдельно, проверив полученный файл … так надежнее.
У меня есть отдельный скрипт, который выводит как надо для контроля. Там итак все "глазками". И все давно отлажено, сбоев не было, поэтому и появилась мысль автоматизировать удаление. Тем более - ничего критичного в удаляемых файлах нет.
vadik
Абракадабра начинается с 5-го по счету каталога
Может символ переменная какие , попробуйте двойные кавычки для имени вместо одинарных
-name "_"
для проверки можно без delete запустить должно вывести пути и по идеи будет видно на чем затык
 
Зарегистрироваться или войдите чтобы оставить сообщение.