Этот вопрос был вызван вопросами о ls
« -1
опциях» и повторяющейся тенденцией людей задавать вопросы и ответы, включая обработку результатов ls
.
Такое повторное использование выходных данных ls
кажется понятным, например: если вы знаете, как сортировать список файлов ls
, возможно, вы захотите использовать выходные данные таким образом в качестве входных данных для чего-то другого.
Если эти вопросы и ответы не включают ссылку на список имен файлов, составленный из имен файлов с хорошим поведением (без специальных символов, таких как пробелы и символы новой строки), они часто комментируются кем-то, указывающим на опасность того, что последовательность команд не работает, когда файлы с переводом строки, пробелами и т. д.
find
, sort
И другие коммунальные услуги решить проблему общения «сложные» имена файлов Е.Г. xargs
, используя опцию для разделения имен файлов с NUL символ / байт , который не является допустимым символом в имени файла (единственный в дополнение к /
?) На Файловые системы Unix / Linux.
Я посмотрел на справочную страницу для ls
и вывод для ls --help
(который имеет больше перечисленных опций) и не смог найти, что ls
(из coreutils
) имеет возможность указать NUL-разделенный вывод. У него есть -1
опция, которую можно интерпретировать как «имена выходных файлов, разделенные символом новой строки» )
В : Есть ли техническая или философская причина, почему ls
нет опции --zero
или, -0
которая бы "выводила имена файлов, разделенные NUL"?
Если вы делаете что-то, что выводит только имена файлов (а не использует, например -l
), это может иметь смысл:
ls -rt -0 | xargs -r0 …
Я мог бы что-то упустить, почему это не сработает, или есть альтернатива для этого примера, которую я упустил из виду, и которая не намного сложнее и / или неясна .
Приложение:
Выполнение, ls -lrt -0
вероятно, не имеет большого смысла, но так же, как это find . -ls -print0
не происходит, так что это не является причиной, чтобы не предоставлять параметр -0
/ -z
/ --zero
.
источник
ls -rtz
определенно было бы полезно. Сравните альтернативу: superuser.com/a/294164/21402Ответы:
ОБНОВЛЕНИЕ (2014-02-02)
Благодаря нашей собственной решимости @ Anthon следить за отсутствием этой функции , у нас есть несколько более формальная причина того, почему эта функция отсутствует, что повторяет то, что я объяснил ранее:
Мой оригинальный ответ
Это немного мое личное мнение, но я считаю, что это было дизайнерское решение, чтобы оставить этот переключатель вне
ls
. Если вы заметили, чтоfind
команда имеет этот переключатель:Оставляя этот выключатель, дизайнеры подразумевали, что вы не должны использовать
ls
выходные данные для чего-либо, кроме потребления человеком. Для последующей обработки другими инструментами, вы должны использоватьfind
вместо этого.Способы использования найти
Если вы просто ищете альтернативные методы, вы можете найти их здесь под названием: « Делать это правильно: краткое резюме» . По этой ссылке это, вероятно, 3 наиболее распространенных шаблона:
(нестандартные общие расширения -print0 и -0. Работает на GNU, * BSD, busybox)
Еще одно доказательство?
Я нашел этот пост в блоге Джои Хесса под названием: « ls: пропущенные опции ». Один из интересных комментариев в этом посте:
Дальнейший поиск Я нашел это в журналах коммитов от одного из дополнительных переключателей, который упоминается в сообщении блога Джои, « новый выходной формат -j », поэтому казалось, что сообщение блога высмеивало идею добавления
-z
переключателяls
.Ссылки
источник
-0
будет реализовано) в моем вопросе, чтобы не вводить людей в заблуждение.ls -1 | tr '\012' '\000'
будут перечислены файлы, разделенные символами NULL.Поскольку ответы @ slm уходят в истоки и возможные причины, я не буду повторять это здесь. Такой вариант не на Coreutils отклоненного список функций , но ниже патч в настоящее отвергнут Padraig Brady после отправки его в Coreutils списка рассылки. Из ответа ясно, что это философская причина (
ls
продукция предназначена для потребления человеком).Если вы хотите попробовать, если такой вариант для вас приемлем, выполните:
затем примените следующий патч к коммиту b938b6e289ef78815935ffa705673a6a8b2ee98e dd 2014-01-29:
После другой марки вы можете проверить это:
Таким образом, патч работает, и я не вижу причины, по которой это не сработает, но это не доказательство, что нет технической причины, чтобы опустить опцию.
ls -R0
может не иметь особого смысла, но не делает то,ls -Rm
чтоls
можно сделать из коробки.источник
-z
и--zero
более соответствует сортировке (также в coreutils.