как вывести имена файлов в кавычках в ОДИНОЧНОЙ строке? - PullRequest
23 голосов
/ 18 мая 2011

Я хотел бы вывести список элементов в папке следующим образом:

"filename1"  "filename2" "file name with spaces" "foldername" "folder name with spaces"

Другими словами, имена предметов должны быть в одной строке, заключены в кавычки (одинарные или двойные) и разделены пробелами.

Я знаю, что

find . | xargs echo

выводит вывод в одну строку, но я не знаю, как добавлять кавычки вокруг каждого имени элемента.

Этот код является частью скрипта bsh. Поэтому решением может быть набор команд и использование временных файлов для хранения промежуточного вывода.

Большое спасибо за любые предложения.

Приветствия, Ана

Ответы [ 8 ]

33 голосов
/ 28 февраля 2013

Вы также можете просто использовать find "-printf", например:

find . -printf "\"%p\" " | xargs your_command

где:

          %p     File's name.

Это окружит все найденные файлы кавычками и отделит каждый элемент с помощьюпространство.Это позволяет избежать использования нескольких команд.

22 голосов
/ 18 мая 2011

это должно работать

find $PWD | sed 's/^/"/g' | sed 's/$/"/g' | tr '\n' ' '

РЕДАКТИРОВАТЬ:

Это должно быть более эффективным, чем предыдущий.

find $PWD | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' '

@ Решение Тимофея будет работать с trв конце концов, и должен быть наиболее эффективным.

find $PWD -exec echo -n '"{}" ' \; | tr '\n' ' '
15 голосов
/ 18 мая 2011

Попробуйте это.

find . -exec echo -n '"{}" ' \;
11 голосов
/ 17 февраля 2016

Вы можете использовать опцию GNU ls --quoting-style, чтобы легко получить то, что вам нужно.Со страницы руководства:

--quoting-style=WORD

используйте стиль цитирования WORD для имен записей: literal, locale, shell, shell-always, shell-escape, shell-escape-always, c, escape

Например, используя команду ls --quoting-style=shell-escape-always, вы получите:

'filename1' 'filename2' 'file name with spaces' 'foldername' 'folder name with spaces'

Используя --quoting-style=c, вы можете точно воспроизвести желаемый пример.Однако, если выходные данные будут использоваться сценарием оболочки, вам следует использовать одну из форм, которая правильно экранирует специальные символы, например shell-escape-always.

2 голосов
/ 04 января 2016

РЕДАКТИРОВАТЬ:
Следующий ответ генерирует LIST с разделением новой строки вместо одной строки.

  1. Я второй догадкато, что OP использует результат для вызова другой команды
  2. , для преобразования выходного LIST в одну строку легко (| tr '\n' ' ')

Менее упомянутый метод заключается в использовании *Параметр 1016 * (--delimiter) xargs:

find . | xargs -I@ -d"\n" echo \"@\" 

-I@ фиксирует каждый find результат как @, а затем мы отображаем его в кавычках

С этим вы можете вызывать любые команды так же, как вы добавили к аргументам кавычки.

$ find . | xargs -d"\n" testcli.js
[ "filename1",
  "filename2",
  "file name with spaces",
  "foldername",
  "folder name with spaces" ]

См. https://stackoverflow.com/a/33528111/665507

2 голосов
/ 18 мая 2011
for f in *; do printf "'%s' " "$f"; done; echo

Или, благодаря Гордону Дэвиссону :

printf "'%s' " *; echo

Трейлинг echo просто добавляет новую строку в выход.

1 голос
/ 26 февраля 2019
    find . | sed "s|.*|\"&\"|"

Краткое описание:
Мы берем результат. * Шаблон и помещаем его в кавычки.
Хороший источник: sed .

Подробное описание:
Шаблон: s / one / ONE /

  • s Команда замены.
  • / Delimiter.
    В моем выражении "|" используется вместо "/" для предотвращения "гор", как в шаблоне s /.* / \ "& \" /.
  • one Шаблон поиска по шаблону регулярного выражения.
  • ONE Строка замены.
  • . * Означает любой символ, который повторяется неограниченное количество раз.
  • \ " Означает " .
  • & Специальный символ, соответствующий найденному шаблону.
0 голосов
/ 29 ноября 2018

попробуй

ls | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' '
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...