Я хочу передавати імена файлів іншим програмам, але всі вони задихаються, коли імена містять пробіли.
Скажімо, у мене є файл з назвою.
foo bar
Як я можу find
домогтися повернення правильного імені?
Очевидно, що я хочу:
foo\ bar
або:
"foo bar"
EDIT : Я не хочу проходити xargs
, я хочу отримати правильно відформатований рядок, find
щоб я міг передавати рядок імен файлів безпосередньо іншій програмі.
find
форматування назв файлів просто чудово; вони записуються по одному імені на рядок. (Звичайно, це неоднозначно, якщо ім'я файлу містить символ нового рядка.) Отже, проблема полягає в тому, що кінець прийому "задихається", коли він отримує пробіл, а це означає, що ви повинні сказати нам, що це кінець прийому, якщо ви хочете змістовної відповіді. .
find
можливість виводу імен файлів у форматі, що підходить для оболонки. В цілому, однак, розширення -print0
GNU 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