我想按照以下方式输出文件夹中的项目列表:
"filename1" "filename2" "file name with spaces" "foldername" "folder name with spaces"
换句话说,项目名称必须在一行中,用引号(单引号或双引号)括起来并用空格分隔。
我知道
find . | xargs echo
在一行中打印输出,但我不知道如何在每个项目名称周围添加引号。
此代码是bsh脚本的一部分。 因此,解决方案可以是一组命令,并使用临时文件来存储中间输出。
非常感谢您的任何建议。
干杯,安娜
答案 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
为条目名称使用引用样式
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脚本使用,则应使用正确转义特殊字符的表单之一,例如shell-escape-always
。
答案 4 :(得分:2)
for f in *; do printf "'%s' " "$f"; done; echo
或者,感谢Gordon Davisson:
printf "'%s' " *; echo
尾随echo
只是为输出添加换行符。
答案 5 :(得分:2)
修改强>
以下答案生成换行的新行而不是单行。
| tr '\n' ' '
)较少提到的方法是使用-d
的{{1}}(--delimiter
)选项:
xargs
find . | xargs -I@ -d"\n" echo \"@\"
将每个-I@
结果捕获为find
,然后我们用引号回显它
使用此功能,您可以在向参数添加引号时调用任何命令。
@
答案 6 :(得分:1)
find . | sed "s|.*|\"&\"|"
简要说明:
我们将。*模式的结果放入引号中。
好的来源是sed。
详细说明:
格式: s / one / ONE /
答案 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 .
。