Я хочу передавати імена файлів іншим програмам, але всі вони задихаються, коли імена містять пробіли.
Скажімо, у мене є файл з назвою.
foo bar
Як я можу findдомогтися повернення правильного імені?
Очевидно, що я хочу:
foo\ bar
або:
"foo bar"
EDIT : Я не хочу проходити xargs, я хочу отримати правильно відформатований рядок, findщоб я міг передавати рядок імен файлів безпосередньо іншій програмі.
findформатування назв файлів просто чудово; вони записуються по одному імені на рядок. (Звичайно, це неоднозначно, якщо ім'я файлу містить символ нового рядка.) Отже, проблема полягає в тому, що кінець прийому "задихається", коли він отримує пробіл, а це означає, що ви повинні сказати нам, що це кінець прийому, якщо ви хочете змістовної відповіді. .
findможливість виводу імен файлів у форматі, що підходить для оболонки. В цілому, однак, розширення -print0GNU findчудово працює для багатьох інших сценаріїв (теж), і вам слід навчитися використовувати його в будь-якому випадку.
ls $(command...)список не подається stdin. Він ставить вихід $(command...)безпосередньо в командний рядок. У такому випадку це оболонка, яка $IFSзчитується з c, і вона використовуватиме поточне значення, щоб вирішити, як розбити слово на виводі. Загалом, вам краще використовувати xargs. Ви не помітите хіт ефективності.
find -printf '"%p"\n'додасть подвійні лапки навколо кожного знайденого імені, але не буде належним чином цитувати подвійні лапки у назві файлу. Якщо в іменах ваших файлів немає вбудованих подвійних лапок, ви можете проігнорувати проблему: або пропустити sed 's/"/&&/g;s/^""/"/;s/""$/"/'. Якщо імена ваших файлів в кінцевому підсумку обробляються оболонкою, ви, ймовірно, повинні використовувати одинарні лапки замість подвійних лапок, хоча (інакше sweet$HOMEвони стануть чимось на зразок sheet/home/you). І це все ще не дуже надійно щодо імен файлів з новими рядками в них. Як ви хочете впоратися з ними?
-execпрапорfind? ви могли потенційно полегшити цю помилку і зробити свою команду більш ефективною, виконуючи-execзамість того, щоб передати її іншим командам. Просто мій $ .02