通过bash变量传递awk输出来查找

时间:2013-10-04 02:49:21

标签: bash awk escaping find quotes

我想获取包含文件的“leaf”目录列表,但前提是这些目录中的任何一个不包含在两个时间范围内更改的文件。 我认为bash脚本会很快..我发现了这个:https://superuser.com/questions/195879/using-find-to-list-only-directories-with-no-more-childs 现在我有了这个:

#!/bin/bash
#get list of deepest directory's with files
#format output so directory's can contain spaces
check_dirs=$( { find . -type d ! -empty ; echo; } |
    awk 'index($0,prev"/")!=1 && NR!=1 {printf("\"%s\" ",prev);}
    {sub(/\/$/,""); prev=$0}' )
#run find once but get two lists of files to bash arrays --todo  
find ${check_dirs} \( -ctime 3 -print \), \( -ctime 8 -print \)

find手动运行时处理空格分隔的引用路径列表 但是当在脚本中运行它会打破空格并添加单引号? 我得到了这种输出:

  

find:`“/ path / to / suff”':没有这样的文件或目录

     

find:`“/ path / to / suff1”':没有这样的文件或目录

     

find:`“/ path / to / suffwith”':没有这样的文件或目录

     

find:`“space”':没有这样的文件或目录

     

find:`“in”':没有这样的文件或目录

     

find:`“name”':没有这样的文件或目录

     

find:`“/ path / to / suff2”':没有这样的文件或目录

这里发生了什么?

2 个答案:

答案 0 :(得分:0)

如您所知,某些路径中包含空格。问题在于:

find ${check_dirs} \( -ctime 3 -print \), \( -ctime 8 -print \)

在这里,你允许在$check_dirs上进行单词分词,并且发现没有从中获取有效参数,所以它不知道如何继续。

当您在交互式shell中使用引号时,bash使用引号来阻止单词分词,但是当引号位于参数内时,bash会在扩展参数后执行wordsplitting ,因此引号只是其中的一部分词语的

第一步是编写一个find命令,“只”输出叶子目录而不用大惊小怪。这是一个

find . -depth -type d -execdir bash -O dotglob -c 'set -- "$1"/*/; ! test -d "$1"' _ {} \; -print

当然,您可以在\;。

之后立即组合您的ctime谓词,而不是-print

答案 1 :(得分:0)

您可以先查找文件,获取目录名称,对列表进行排序,获取唯一值并对最终列表执行某些操作。

find . -newermt '2013-10-04 10:00:01' -not -newermt '2013-10-04 10:04:01' -print0 | \
xargs -r0 dirname | sort | uniq # <do something with your list>