2014-10-27 48 views
0

如何列出包含特定文件的所有目录,并使用shell脚本将它们存储在数组中。我尝试了下面的代码,但它给了我这个错误:ls: **/myFile.txt: No such file or directorymyFile.txt可以是任何文件。列出包含特定文件的所有目录并将它们存储在数组中

代码:

folderArray = ($(ls **/myFile.txt | tr -d myFile.txt)) 
echo folderArray 
for folder in ${folderArray[@]} 
do 
    echo "myFile.txt is present in $folder" 
done 
+0

你得到的错误信息表明'**'不被识别为匹配模式,它会查找名为'**/myFile.txt'的文件。可能是因为'GLOB'选项未设置(使用'setopt | grep'^ noglob $'进行检查)。 'tr'也适用于单个字符,因此'tr -d abc'不仅会删除strc'abc',还会删除'a','b'和'c'。 – Adaephon 2014-10-27 07:09:57

回答

1

您可以使用此命令可以列出所有包含myFile.txt目录:

find . -type f -name 'myFile.txt' -print0 | xargs -0 -I {} dirname {} 

并将它们存储在一个数组:

arr=($(find . -type f -name 'foo.*' -print0 | xargs -0 -I {} dirname {})) 
+1

尽管使用find的zsh大部分是一个更一般的解决方案 – SergioAraujo 2014-10-27 09:59:32

1

使用zsh的功率:

folderArray=($(echo **/myFile.txt(N^/:h))) 

最后的()内部的标记是在文件名生成中使用的所谓的glob修饰符。

  • N:设置NULL_GLOB选项
  • ^/:只匹配文件,而不是目录
  • :h:去掉文件名的成绩,从`ls`可以作为dirname
相关问题