Arrays 如何捕获ls或find命令的输出以将所有文件名存储在一个数组中?
需要一次处理一个当前目录中的文件。我正在寻找一种方法来获取Arrays 如何捕获ls或find命令的输出以将所有文件名存储在一个数组中?,arrays,bash,find,capture,ls,Arrays,Bash,Find,Capture,Ls,需要一次处理一个当前目录中的文件。我正在寻找一种方法来获取ls或find的输出,并将结果值存储为数组元素。这样,我可以根据需要操纵数组元素。根据需要,可以使用xargs: ls directory | xargs cp -v dir2 比如说。xargs将对返回的每个项目执行操作。要回答您的确切问题,请使用以下命令: arr=( $(find /path/to/toplevel/dir -type f) ) 例子 但是,如果您只想一次处理一个文件,您可以使用find的-exec选项(如果脚本
ls
或find
的输出,并将结果值存储为数组元素。这样,我可以根据需要操纵数组元素。根据需要,可以使用xargs:
ls directory | xargs cp -v dir2
比如说。xargs将对返回的每个项目执行操作。要回答您的确切问题,请使用以下命令:
arr=( $(find /path/to/toplevel/dir -type f) )
例子
但是,如果您只想一次处理一个文件,您可以使用find
的-exec
选项(如果脚本有点简单),也可以对find返回的内容进行循环:
while IFS= read -r -d $'\0' file; do
# stuff with "$file" here
done < <(find /path/to/toplevel/dir -type f -print0)
而IFS=read-r-d$'\0'文件;做
#在这里填充“$file”
完成<您实际上不需要对当前目录中的文件使用ls/find
只需使用for循环:
for files in *; do
if [ -f "$files" ]; then
# do something
fi
done
如果您也想处理隐藏文件,可以设置相对选项:
shopt -s dotglob
最后一个命令仅在bash中有效
for i in `ls`; do echo $i; done;
再简单不过了
编辑:嗯-根据丹尼斯·威廉姆森的评论,似乎你可以
编辑2:尽管OP特别询问如何解析ls
的输出,但我只想指出,正如下面的评论员所说,正确的答案是“你没有”。在*
中为i使用,或者类似的方法。这就是我要找的。谢谢。@ChandanChoudhuryread-r-d$'\0'
告诉read
命令不要将反斜杠视为特殊转义字符,并用NUL字符分隔每个单词,因为我们告诉find
将其用作-print0
的分隔符。IFS=
部分基本上取消了特殊内部字段分隔符环境变量的设置,因此它不会对制表符、空格或新行执行分词。TLDR的版本是,这些命令使您可以在任何文件名上进行迭代,而不知道它包含什么类型的字符。将IFS=
移动到while前面是否可行:IFS=;而代码>?此外,此控制结构与使用管道之间是否存在差异:find…|而……
?对于我来说*
更简单<代码>用于i in*;do…
做同样的事情,只是它不会被文件名中有趣的字符所迷惑,并且运行得更快(因为它不会产生另一个进程)。@DennisWilliamson有没有办法使用变量(包含路径)而不是*
:来代替in$path/*
@PHPLearner:是的。正如您发布的,但是您应该引用变量<代码>用于“$path”/*
@gordondavison中的f,用于*中的i;do echo“$i”done
将在空目录中输出*
。@Fritschy:如果您的cp
支持它,您可以使用xargs cp-v--target drectory dir2
@Dennis:它支持;)但是上面还是没有;)@Fritschy:失败的一个原因是任何文件名都包含空格。使用查找-print0 | xargs-0
可以解决这个问题。到底是怎么搞砸的?它适合我。%files
应该是$files
。此外,如果您有bash4.X,您可以设置shopt-sglobstar
并对**中的文件使用;do
是递归的;完全删除对查找的使用
谢谢!我已经改正了错误;顺便说一下,我有Bash4,但OP(或其他读者)可能没有:)@SiegeX我如何接受答案?我回应并感谢那些在我获得特权时回答最好并投票给他们的人。我还能做什么?
for i in `ls`; do echo $i; done;