如何在SINGLE行中输出用引号括起来的文件名?

Ana*_*Ana 26 unix bash find xargs

我想以下面的方式输出文件夹中的项目列表:

"filename1"  "filename2" "file name with spaces" "foldername" "folder name with spaces"
Run Code Online (Sandbox Code Playgroud)

换句话说,项目名称必须在一行中,用引号(单引号或双引号)括起并用空格分隔.

我知道

find . | xargs echo
Run Code Online (Sandbox Code Playgroud)

打印输出在一行,但我不知道如何在每个项目名称周围添加引号.

此代码是bsh脚本的一部分.因此,解决方案可以是一组命令,并使用临时文件来存储中间输出.

非常感谢您的任何建议.

干杯,安娜

Ben*_* A. 34

您也可以使用find"-printf",如下所示:

find . -printf "\"%p\" " | xargs your_command
Run Code Online (Sandbox Code Playgroud)

哪里:

%p = file-path
Run Code Online (Sandbox Code Playgroud)

这将用引号括住每个找到的文件,并用空格分隔每个项目.这避免了使用多个命令.

  • -printf在OSX上不可用. (3认同)
  • ...如果文件名包含引号,则会失败。 (3认同)

fre*_*ker 24

这应该工作

find $PWD | sed 's/^/"/g' | sed 's/$/"/g' | tr '\n' ' '
Run Code Online (Sandbox Code Playgroud)

编辑:

这应该比前一个更有效.

find $PWD | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' '
Run Code Online (Sandbox Code Playgroud)

@Timofey的解决方案最终将与tr一起使用,并且应该是最有效的.

find $PWD -exec echo -n '"{}" ' \; | tr '\n' ' '
Run Code Online (Sandbox Code Playgroud)

  • 请,请不要。首先,如果您的$ PWD包含空格或文字扩展名,则查找$ PWD的行为会很差。其次,用双引号引起来的名称转义是一种较弱且容易规避的机制-有效的文件名本身可以包含“”或“”字符,从而使整个流的其余部分都无法解析。 (2认同)

Geo*_*ard 17

您可以使用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'
Run Code Online (Sandbox Code Playgroud)

使用--quoting-style=c,您可以完全重现您想要的示例.但是,如果输出将由shell脚本使用,则应使用正确转义特殊字符的表单之一,例如shell-escape-always.

  • 相关:'ls -Q';#添加双引号 (2认同)

Tim*_*bov 15

试试这个.

find . -exec echo -n '"{}" ' \;
Run Code Online (Sandbox Code Playgroud)

  • 删除 -n 以获取包含换行符的结果。 (2认同)

Mic*_*hen 10

10 年过去了,没有人建议使用 Bash“|while read”方法吗?

find * -type d -depth 0|while read f; do echo \"$f\"; done
Run Code Online (Sandbox Code Playgroud)

它是一个简单的 Bash shell 管道,而不是启动另一个程序(如 sed 或 xarg)。如果您确实想对每个文件/文件夹执行某些操作:

find * -type d -depth 0|while read f; do du -sh "$f"; done
Run Code Online (Sandbox Code Playgroud)

顺便说一下,find *使用另一个 Bash 功能排除 .xyz 文件/文件夹,并且不会输出./前缀find .


gle*_*man 5

for f in *; do printf "'%s' " "$f"; done; echo
Run Code Online (Sandbox Code Playgroud)

或者,感谢戈登·戴维森

printf "'%s' " *; echo
Run Code Online (Sandbox Code Playgroud)

尾随echo只是在输出中添加换行符。

  • 这可以进一步简化:`printf "'%s' " *`。 (2认同)