我在Linux& bash(或Cygwin& bash)。
我有一个巨大的巨大的 - 目录结构,我必须在大海捞针中找到一些针。
具体来说,我正在寻找这些文件(20个左右):
foo.c
bar.h
...
quux.txt
我知道他们位于.
下的某个子目录中。
我知道我可以找到他们中的任何一个
find . -name foo.c -print
。此命令需要几分钟才能执行。
如何使用完整目录名打印这些文件的名称?我不想执行20个单独的find
- 它将花费太长时间。
我可以从stdin中提供find
文件列表吗?从文件?是否有一个不同的命令可以满足我的需求?
我是否必须首先使用循环或其他内容为find
-o
组装命令行?
答案 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.conf
(updatedb.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
)