LINUX.ORG.RU

Bash. Удаление файлов по списку, в названии которых есть пробелы

 , , ,


0

4

Есть похожие темы на форуме, почитал. Сел на линь недавно, куски из разных тем не могу собрать воедино, хотя думаю это элементарно. Задача проста: есть список list.txt, в нём строки такого типа:

  • /files/file.txt
  • /files/file2.txt
  • /files/file3.txt
  • /files/new file.doc
  • /files/new file2.doc

Названия и расширения файлов могут быть разными, главное что в именах присутствуют пробелы!
Команды

rm -i $(cat /list/list.txt)
и
cat /list/list.txt | xargs rm -rv
удаляют только те файлы, в названии которых нет пробелов. Имена с пробелами воспринимаются как 2 файла, соответственно: не найдено. Пробовал в списке экранировать имена с пробелами (одинарные или двойные кавычки,\(.....\), пробел обратным слешем), не работает, опыта мало в таких тонкостях, подскажите куда копать.

tr '\n' '\0' | xargs -0 rm -f

arto ★★
()
Ответ на: комментарий от evilface

Работает. Отлично. Благодарю великодушно )). затевалось для openwrt. Пойду теперь почитаю про кодировки, т. к. названия с кириллицей не удаляются.

egor666
() автор топика
sudo cat list.txt | xargs -d "\n" rm
nerve ★★
()
Ответ на: комментарий от egor666

Благодари ArcFi, я только вызов cat выкинул.

На openwrt должен быть sed вроде. Можно попробовать мой первый вариант, sed умеет в местную кодировку обычно, раз с read проблемы. Хотя странно.

evilface ★★
()
Ответ на: комментарий от evilface

Так то задача решена что описана в топике, а костыль для кириллицы я какой нибудь прикручу потом. Большое спасибо всем участникам.

egor666
() автор топика

rm -i $(cat /list/list.txt)

если файл небольшой то можно попробовать и так:

( IFS='
'
rm -i -- .. )

(подпроцесс дабы не сохранять и восстанавливать IFS)

а так лучше, конечно, xargs -0, если поддерживается

anonymous
()
Ответ на: комментарий от egor666
for i in list.txt ; do rm "$i" ; done 

Как-то так

Пойду теперь почитаю про кодировки, т. к. названия с кириллицей не удаляются.

В файле сконвертируй названия в ту кодировку, в которой у тебя имена файлов. Скорее всего тебе надо utf-8

Csandriel_forever
()
Ответ на: комментарий от anonymous

Пойду теперь почитаю про кодировки, т. к. названия с кириллицей не удаляются.

В файле сконвертируй названия в ту кодировку, в которой у тебя имена файлов. Скорее всего тебе надо utf-8

Ананимас ты прав, я тупанул. Это в винде for построчно читает файлы. С ним как-то не получается здесь. Зато выяснил в чем разница между while read и for in. В первом случае можно читать строки целиком а во втором можно токены в цикле крутить. Сегодня не мой день. Хотя мой. Просто тред не мой ^_^

Csandriel_forever
()
Ответ на: комментарий от anonymous

подпроцесс дабы не сохранять и восстанавливать IFS

Должно быть достаточно после действия сделать unset IFS

sin_a ★★★★★
()
Ответ на: комментарий от Twissel

Это «every» наверное. Дайте догадаюсь. Тоесть для каждой строки, а не для первого вхождения только. А вот это «&» мне тоже интересно. Наверное значит всю строку

Csandriel_forever
()
Ответ на: комментарий от Csandriel_forever

Сегодня не мой день. Хотя мой. Просто тред не мой ^_^

А я все же сделаю бочку

cat names.txt|sed -r 's_\(.*[ ].*\)_rm "\1"_'|sh 

Удаляет только те файлы, в названиях которых есть пробелы.

наверное. Не проверял

Csandriel_forever
()
Ответ на: комментарий от Csandriel_forever

Это «every» наверное. Дайте догадаюсь. Тоесть для каждой строки, а не для первого вхождения только. А вот это «&» мне тоже интересно. Наверное значит всю строку

Это «execute», пояснение по ссылке комментарием выше.

& — то что сматчилось в первой части команды подстановки, полностью.

evilface ★★
()
Последнее исправление: evilface (всего исправлений: 1)

Делал для данного случая небольшую прогу на c++/boost::filesystem/boost::regexp, т.к. для меня оказалось логичнее и понятнее чем на баше. Только я при этом файлы не удалял, а переименовывал. Если что могу дать исходник.

rumgot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.