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

时间:2011-05-18 08:04:55

标签: bash unix find xargs

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

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

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

我知道

find . | xargs echo

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

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

非常感谢您的任何建议。

干杯,安娜

10 个答案:

答案 0 :(得分:33)

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

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

其中:

          %p     File's name.

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

答案 1 :(得分:21)

这应该有效

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' ' '

答案 2 :(得分:14)

试试这个。

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

答案 3 :(得分:11)

您可以使用GNU ls选项--quoting-style轻松获取所需内容。从手册页:

  

--quoting-style=WORD

     
    

为条目名称使用引用样式WORDliterallocaleshellshell-alwaysshell-escapeshell-escape-alwayscescape

  

例如,使用命令ls --quoting-style=shell-escape-always,输出变为:

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

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

答案 4 :(得分:2)

for f in *; do printf "'%s' " "$f"; done; echo

或者,感谢Gordon Davisson

printf "'%s' " *; echo

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

答案 5 :(得分:2)

修改
以下答案生成换行的新行而不是单行。

  1. 我第二次猜测OP使用结果来调用其他命令
  2. 将输出LIST转换为单行很容易(| tr '\n' ' '
  3. 较少提到的方法是使用-d的{​​{1}}(--delimiter)选项:

    xargs
      

    find . | xargs -I@ -d"\n" echo \"@\" 将每个-I@结果捕获为find,然后我们用引号回显它

    使用此功能,您可以在向参数添加引号时调用任何命令。

    @

    请参阅https://stackoverflow.com/a/33528111/665507

答案 6 :(得分:1)

    find . | sed "s|.*|\"&\"|"

简要说明:
我们将。*模式的结果放入引号中。
好的来源是sed

详细说明:
格式: s / one / ONE /

  • s 替代命令。
  • / 定界符。
    在我的表达式中,使用“ |” 代替“ /” 来防止类似的“山峰”格式为s/.*/\"&\"/。
  • 一个正则表达式模式搜索模式。
  • 一个替换字符串。
  • 。* 表示可重复无限次的任何符号。
  • \“ 表示本身。
  • 与找到的模式相对应的特殊字符。

答案 7 :(得分:0)

尝试

input

答案 8 :(得分:0)

为避免黑客试图手动添加引号,您可以利用printf的{​​{1}}格式选项:

%q

vs:

❯ ll .zshrc.d
total 112K
-rwxrwxrwx 1 root root  378 Jul  1 04:39  options.zsh*
-rwxrwxrwx 1 root root   57 Jul  1 04:39  history.zsh*
-rwxrwxrwx 1 root root  301 Jul  1 05:01  zinit.zsh*
-rwxrwxrwx 1 root root  79K Jul  1 05:19  p10k.zsh*
-rwxrwxrwx 1 root root  345 Jul  1 05:24  zplugins.zsh*
-rwxrwxrwx 1 root root  490 Jul  4 23:40  aliases.zsh*
-rw-r--r-- 1 root root 9.0K Jul 27 08:14  lscolors.zsh
-rw-r--r-- 1 root root    0 Aug 30 05:56 'foo bar'
-rw-r--r-- 1 root root    0 Aug 30 05:58 '"foo"'

❯ find .zshrc.d -exec printf '%q ' {} +
.zshrc.d .zshrc.d/history.zsh .zshrc.d/aliases.zsh .zshrc.d/zplugins.zsh .zshrc.d/p10k.zsh .zshrc.d/zinit.zsh .zshrc.d/options.zsh '.zshrc.d/"foo"' '.zshrc.d/foo bar' .zshrc.d/lscolors.zsh #

请注意,文件find .zshrc.d -printf "\"%p\" " ".zshrc.d" ".zshrc.d/history.zsh" ".zshrc.d/aliases.zsh" ".zshrc.d/zplugins.zsh" ".zshrc.d/p10k.zsh" ".zshrc.d/zinit.zsh" ".zshrc.d/options.zsh" ".zshrc.d/"foo"" ".zshrc.d/foo bar" ".zshrc.d/lscolors.zsh" # 的转义错误。

.zshrc.d/"foo"

答案 9 :(得分:0)

10 年后,没有人提出 Bash 的“|while read”方法?

find * -type d -depth 0|while read f; do echo \"$f\"; done

这是一个简单的 Bash shell 管道,而不是启动另一个程序,如 sed 或 xarg。如果你真的想对每个文件/文件夹做一些事情:

find * -type d -depth 0|while read f; do du -sh "$f"; done

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