Как выводить имена файлов, окруженные кавычками в строке SINGLE?
Я хотел бы вывести список элементов в папке следующим образом:
"filename1" "filename2" "file name with spaces" "foldername" "folder name with spaces"
Другими словами, имена элементов должны быть в одной строке, окруженной кавычками (одиночными или двойными) и разделяемыми пробелами.
Я знаю, что
find . | xargs echo
выводит вывод в одной строке, но я не знаю, как добавлять кавычки вокруг каждого имени элемента.
Этот код является частью bsh script.
Таким образом, решение может быть набором команд и использовать временные файлы для хранения промежуточного вывода.
Большое спасибо за любое предложение.
Приветствия, Ана
Ответы
Ответ 1
это должно работать
find $PWD | sed 's/^/"/g' | sed 's/$/"/g' | tr '\n' ' '
EDIT:
Это должно быть более эффективным, чем предыдущее.
find $PWD | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' '
Решение @Timofey будет работать с tr в конце и должно быть наиболее эффективным.
find $PWD -exec echo -n '"{}" ' \; | tr '\n' ' '
Ответ 2
Вы также можете просто использовать find "-printf", например:
find . -printf "\"%p\" " | xargs your_command
где:
%p = file-path
Это окружит каждый найденный путь к файлу кавычками и разделит каждый элемент пробелом.
Это позволяет избежать использования нескольких команд.
Ответ 3
Попробуйте это.
find . -exec echo -n '"{}" ' \;
Ответ 4
Вы можете использовать параметр 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
, вы можете точно воспроизвести желаемый пример. Однако, если выход будет использоваться оболочкой script, вы должны использовать одну из форм, которая правильно экранирует специальные символы, такие как shell-escape-always
.
Ответ 5
for f in *; do printf "'%s' " "$f"; done; echo
Или, благодаря Гордон Дэвиссон:
printf "'%s' " *; echo
Конечная echo
- это просто добавить новую строку к выводу.
Ответ 6
EDIT:
Следующий ответ генерирует LIST вместо LINE вместо отдельной строки.
- Я второй подозреваю, что OP использует результат для вызова другой команды
- преобразование выходного СПИСОК в одну строку легко (
| 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" ]
См. fooobar.com/questions/33871/...
Ответ 7
find . | sed "s|.*|\"&\"|"
Краткое описание:
Мы берем шаблон. * и помещаем его в кавычки.
Хороший источник - sed.
Подробное описание:
Шаблон: s/one/ONE/
- s Заменить команду.
- / Разделитель.
В моем выражении "|" используется вместо "/" для предотвращения "гор", как в шаблоне s/.*/\"& amp;.\"/
- один шаблон поиска шаблона регулярного выражения.
- ОДИН Строка замены.
- . * Означает любой символ, который повторяется неограниченное количество раз.
- \ " Означает " себя.
- & amp; Специальный символ, соответствующий найденному шаблону.
Ответ 8
попробуйте
ls | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' '