2011-04-24 43 views
9

我要管一个查找结果到一个新的发现。我所拥有的是:管道找到找到

find . -iname "2010-06*" -maxdepth 1 -type d | xargs -0 find '{}' -iname "*.jpg" 

预期结果:第二个find接收开始2010-06文件夹列表,第二个find返回包含这些文件夹中JPG文件的列表。

实际结果是: “发现:./2010-06纽约\ N:未知的选项”

啊,妈的。我有一种感觉,它涉及到第二次发现的输出格式作为输入,但我唯一的想法是后缀-print0首先找到,没有任何变化。

任何想法?

回答

8

你需要两件事情。 -print0,并在xargs的更重要的是-I{},否则{}没有做任何事情。

find . -iname "2010-06*" -maxdepth 1 -type d -print0 | xargs -0 -I{} find '{}' -iname '*.jpg' 
+0

太棒了。这按预期工作。 – 2011-04-24 23:23:40

+1

你确定这可以吗? -iname – ghostdog74 2011-04-25 01:03:54

+0

从'man find':“ - 假定操作员被省略。”因此,顺序无关紧要,因为它们都经过评估,并且都必须是真实的。 – 2011-04-25 02:09:28

1

如何

find . -iwholename "./2010-06*/*.jpg 

等?

+0

您必须在给定选项的值中包含前导“./”。 – 2011-04-24 23:19:02

+0

它是'-iwholename',而不是'-iwholepath' – 2011-04-24 23:19:36

+0

更好的解决方案,你是对的。尽管我没有彻底解释,我有兴趣使管道工作,而不是特别是这个发现问题。谢谢您的好意。 :-) – 2011-04-24 23:22:41

1

虽然你没有说你特别希望这一发现+管道问题的工作,其效率低下到餐桌的额外find命令。由于您将-maxdepth指定为1,因此您没有遍历子目录。所以只需使用for循环与外壳扩展。

for file in *2010-06*/*.jpg 
do 
    echo "$file" 
done 

如果你想找到的每个2010-06 *文件夹递归内的所有JPG文件,也没有必要使用多个findsxargs

for directory in 2010-06*/ 
do 
    find $directory -iname "*.jpg" -type f 
done 

或者只是

find 2006-06* -type f -iname "*.jpg"

甚至更​​好,如果你有bash的4及以上

shopt -s globstar 
shopt -s nullglob 
for file in 2010-06*/**/*.jpg 
do 
    echo "$file" 
done 
+1

这与功能不匹配。-maxdepth 1消除了./abc/2010-06/def/ghi.jpg,但没有./2010-06/def/ghi.jpg。 – 2011-04-25 00:43:32

+0

我建议你为自己做一个测试并找出答案。查看maxdepth的查找手册页。 – ghostdog74 2011-04-25 01:01:49

+1

我建议你试试这个测试用例:'mkdir -p 2010-06/def; touch 2010-06/def/ghi.jpg; * 2010-06 */*。jpg;做回声“$文件”;完成'输出:'bash:不匹配:* 2010-06 */*。jpg'(打开bash的glob失败) – 2011-04-25 01:13:34

6

没用使用的xargs。

find 2010-06* -iname "*.jpg" 

至少Gnu-find接受多个路径进行搜索。-maxdepth和type -d是隐式假定的。