использование bash для обработки текстового файла, состоящего из имен путей

Мне нужна помощь с обработкой текстового файла bash. Пытаясь очистить десятилетия использования Windows, я написал простую команду для поиска всех экземпляров определенного файла, в частности всех файлов Desktop.ini. Результаты, насколько я могу судить, идеальны.

находить . -name "desktop.ini" > ~/desktop-ini.txt дает мне 1038 строк:

./Билли Джоэл/Greatest Hits, Vols. 1 и 2 (1973–1985), Диск 1/desktop.ini
./Билли Джоэл/Greatest Hits, Vols. 1 и 2 (1973–1985), Диск 2/desktop.ini
./Билли Джоэл/desktop.ini

Итак, теперь я хотел бы удалить все эти файлы с помощью сценария оболочки, но, как вы можете видеть, существует масса непредсказуемых «специальных символов», которые помешают простому сценарию rm <$filepath>. Я попробовал (один раз) одну строку, заключающую всю строку в одинарные кавычки ('), и это сработало.

rm './Aerosmith/Classics Live!, Vol. 2/desktop.ini'

Но в сценарии оболочки (и замене синтаксиса rm на синтаксис ls) он великолепно вылетает (конечно). Может ли кто-нибудь указать мне на инструкции или ресурс (помимо общего регулярного выражения, sed или текста awk), чтобы узнать, как обрабатывать путь к файлу, чтобы он был представлен правильно?

Я подумал о нескольких вещах, таких как подсчет символов «/», поиск последнего, создание новой строки, «cd» в этот каталог, удаление файла, возвращение в корень и повторение. Это имеет логический смысл, но требует, чтобы строка не нарушала код, что и происходит (пока). Спасибо за любые идеи по этому поводу.

1 ответ

$ find . -name "desktop.ini" | sed -re "s/^/rm '/" -e "s/$/'/"

... создает команды для выполнения, поэтому - после проверки правильности вывода...

... | bash
в конце это должно произойти.


$ sed -re <~/desktop-ini.txt "s/^/rm '/" -e "s/$/'/"
rm './Билли Джоэл/Greatest Hits, Vols. 1 и 2 (1973–1985), Диск 1/desktop.ini'
rm './Билли Джоэл/Greatest Hits, Vols. 1 и 2 (1973–1985), Диск 2/desktop.ini'
rm './Билли Джоэл/desktop.ini'
Другие вопросы по тегам