использование 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'