it-roy-ru.com

как вывести имена файлов в кавычках в ОДИНОЧНОЙ строке?

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

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

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

Я знаю это 

find . | xargs echo

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

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

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

Ура, Ана

22
Ana

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

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

Правка:

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

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

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

find $PWD -exec echo -n '"{}" ' \; | tr '\n' ' '
21
freethinker

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

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

где:

          %p     File's name.

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

33
Benjamin A.

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

find . -exec echo -n '"{}" ' \;
14
Timofey Stolbov

Вы можете использовать опцию 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.

11
George Hilliard

Правка:
Следующий ответ генерирует LIST с разделением новой строкой вместо одной строки.

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

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

find . | xargs [email protected] -d"\n" echo \"@\" 

[email protected] фиксирует каждый результат 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
leesei
for f in *; do printf "'%s' " "$f"; done; echo

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

printf "'%s' " *; echo

Завершающий echo - просто добавить новую строку в вывод.

2
glenn jackman
    find . | sed "s|.*|\"&\"|"

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

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

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

пытаться

ls | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' '
0
Ferroao