Unix find:来自stdin的文件列表

时间:2011-05-31 10:07:49

标签: bash unix find

我在Linux& bash(或Cygwin& bash)。

我有一个巨大的巨大的 - 目录结构,我必须在大海捞针中找到一些针。

具体来说,我正在寻找这些文件(20个左右):

foo.c
bar.h
...
quux.txt

我知道他们位于.下的某个子目录中。

我知道我可以找到他们中的任何一个 find . -name foo.c -print。此命令需要几分钟才能执行。

如何使用完整目录名打印这些文件的名称?我不想执行20个单独的find - 它将花费太长时间。

我可以从stdin中提供find文件列表吗?从文件?是否有一个不同的命令可以满足我的需求?

我是否必须首先使用循环或其他内容为find -o组装命令行?

5 个答案:

答案 0 :(得分:11)

如果您的目录结构很大但不经常更改,那么最好运行

cd /to/root/of/the/files
find . -type f -print > ../LIST_OF_FILES.txt #and sometimes handy the next one too
find . -type d -print > ../LIST_OF_DIRS.txt

之后你可以真正快速找到任何东西(使用grep,sed等)并仅在更改树时更新文件列表。 (如果您没有locate

,这是一个简化的替代品

所以,

grep '/foo.c$' LIST_OF_FILES.txt #list all foo.c in the tree..

想要查找文件列表时,可以尝试以下操作:

fgrep -f wanted_file_list.txt < LIST_OF_FILES.txt

或直接使用find命令

find . type f -print | fgrep -f wanted_file_list.txt

fgrep的-f意味着 - 从文件中读取模式,因此您可以轻松地为多个模式点击输入......

答案 1 :(得分:3)

您不需要运行find二十次。

您可以使用多个文件名说明符构造单个命令:

find . \( -name 'file1' -o -name 'file2' -o -name 'file3' \) -exec echo {} \;

答案 2 :(得分:2)

locate(1)命令是否可以接受?每晚它会建立一个索引,你可以很快地查询索引:

$ time locate id_rsa
/home/sarnold/.ssh/id_rsa
/home/sarnold/.ssh/id_rsa.pub

real    0m0.779s
user    0m0.760s
sys 0m0.010s

我放弃了在36秒内在我的主目录中执行类似的find命令。 :)

如果每晚不起作用,您可以在运行updatedb(8)查询之前手动运行locate(1)程序。 /etc/updatedb.confupdatedb.conf(5))允许您选择要包含或排除的特定目录或文件系统类型。

答案 3 :(得分:1)

答案 4 :(得分:0)

这是一种从stdin处理文件列表并组装你的(FreeBSD)find命令以使用扩展正则表达式匹配(n1|n2|n3)的方法。

对于GNU find,您可能必须使用以下选项之一来启用扩展正则表达式匹配:

-regextype posix-egrep

-regextype posix-extended

echo '
foo\\.c
bar\\.h
quux\\.txt
' | xargs bash -c '
IFS="|"; 
find -E "$PWD" -type f -regex "^.*/($*)$" -print
echo find -E "$PWD" -type f -regex "^.*/($*)$" -print
' arg0

# note: "$*" uses the first character of the IFS variable as array item delimiter
(
IFS='|'
set -- 1 2 3 4 5
echo "$*"   # 1|2|3|4|5
)