Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何捕获ls或find命令的输出以将所有文件名存储在一个数组中?_Arrays_Bash_Find_Capture_Ls - Fatal编程技术网

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使用
,或者类似的方法。

这就是我要找的。谢谢。@ChandanChoudhury
read-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;