Поиск файла который имеет спецсимвол, и применение к нему прав. UNIX

Поиск файла который имеет спецсимвол, и применение к нему прав. UNIX

26.10.2017 03:09:23 Просмотров 23 Источник

Есть файлы:

\\test
test\
te\\st

find ~test/* -name '*\\*' , находит все файлы с \ , далее добавляю find ~test/* -name '*\\*' | xargs -i{} chmod 777 {} , и получаю ошибку что таких файлов нет, потому-что в аргументы уже один \ . Вообщем как правильно проэкранировать бэкслеш чтоб возможно было применять права через xargs ?

У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/736195/%d0%9f%d0%be%d0%b8%d1%81%d0%ba-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%ba%d0%be%d1%82%d0%be%d1%80%d1%8b%d0%b9-%d0%b8%d0%bc%d0%b5%d0%b5%d1%82-%d1%81%d0%bf%d0%b5%d1%86%d1%81%d0%b8%d0%bc%d0%b2%d0%be%d0%bb-%d0%b8-%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d0%bd%d0%b5%d0%bd%d0%b8%d0%b5-%d0%ba-%d0%bd%d0%b5%d0%bc%d1%83-%d0%bf%d1%80%d0%b0%d0%b2-unix#comment1122030_736195
дополнил ответ.

Ответы - Поиск файла который имеет спецсимвол, и применение к нему прав. UNIX / Поиск файла который имеет спецсимвол, и применение к нему прав. UNIX

Является ответом!
aleksandr barakin

26.10.2017 03:51:42

вероятно, проще всего воспользоваться опцией -exec программы find:

$ find где -name '*\\*' -exec chmod a=rwx {} \;
  • '*\\*' — под этот шаблон попадут все файлы/каталоги, содержащие хотя бы один символ \ (дважды повторен он для экранирования самого себя)
  • a=rwx — это человекочитаемый синоним числа 0777, понимаемого программой chmod в качестве первого параметра
  • -exec программа опции-параметры {} другие-опции-параметры \; — это синтаксис опции -exec программы find. при желании \; можно заменить на ';'. главное, чтобы эта точка-с-запятой была экранирована и не воспринималась оболочкой как оператор, соединяющий две команды оболочки.

хотя, конечно, можно воспользоваться и программой xargs. только для того, чтобы исключить интерпретацию экранирования и тому подобного, надо через конвейер между find и xargs передавать список, разделённый нулевыми символами, а не символами перевода строки:

$ find -name '*\\*' -print0 | xargs -0 -I '{}' chmod a=rwx '{}'
  • -print0 — сформировать список, разделённый нулевыми символами
  • -0 — читать список, разделённый нулевыми символами
Закрыть X