1

我想获取包含文件的“叶”目录列表,但前提是这些目录中的任何一个都不包含在两个时间范围内更改的文件。我认为 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"': 没有这样的文件或目录

这里发生了什么事?

4

2 回答 2

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>
于 2013-10-04T13:11:21.073 回答
0

如您所知,找到的某些路径中有空格。问题是这里的行:

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

在这里,您允许 wordplitting on $check_dirs,并且 find 没有从中获得有效的参数,因此它不知道如何进行。

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

第一步是编写一个“仅”输出叶目录的查找命令,而不会大惊小怪。这是一个

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

当然,-print您也可以直接在 \; 之后组合您的 ctime 谓词。

于 2013-10-04T02:54:55.117 回答