如何在shell的递归目录中列出特定类型的文件?
Posted
技术标签:
【中文标题】如何在shell的递归目录中列出特定类型的文件?【英文标题】:How to list specific type of files in recursive directories in shell? 【发布时间】:2011-04-01 12:05:54 【问题描述】:我们如何找到特定类型的文件,即嵌套目录中存在的 doc pdf 文件。
我试过的命令:
$ ls -R | grep .doc
但如果有像alok.doc.txt
这样的文件名,该命令也会显示该文件名,这显然不是我想要的。我应该改用什么命令?
【问题讨论】:
【参考方案1】:如果您的文件扩展名与文件类型不匹配,您可以使用file
实用程序。
find $PWD -type f -exec file -N \\ \; | grep "PDF document" | awk -F: 'print $1'
您可以使用要开始搜索的目录来代替$PWD
。file
甚至打印出 PDF 版本。
【讨论】:
【参考方案2】:我们有一个类似的问题。我们想要一个包含路径的列表,包含 etc 目录中的所有配置文件。这有效:
find /etc -type f \( -iname "*.conf" \)
它提供了所有 .conf 文件及其路径的漂亮列表。输出如下:
/etc/conf/server.conf
但是,我们想对所有这些文件做一些事情,比如 grep 这些文件以在所有文件中查找单词或设置。所以我们使用
find /etc -type f \( -iname "*.conf" \) -print0 | xargs -0 grep -Hi "ServerName"
通过 grep 查找 /etc 中包含“ServerName”等设置的所有配置文件输出如下所示:
/etc/conf/server.conf: ServerName "default-118_11_170_172"
希望你觉得它有用。
席德
【讨论】:
【参考方案3】:find . | grep "\.doc$"
这也会显示路径。
【讨论】:
【参考方案4】:如果您更习惯使用“ls”和“grep”,您可以在 grep 命令中使用正则表达式来做您想做的事情(结尾的 '$' 字符表示 .doc 必须位于行尾. 那将排除“file.doc.txt”):
ls -R |grep "\.doc$"
更多关于在the man中使用grep和正则表达式的信息。
【讨论】:
转义点可能很好,否则像hellodoc
这样的文件也会匹配。 ls -R | grep "\.doc$"
有没有办法让你看到ls
找到的文件的完整路径?现在我只是一个所有文件的列表,但我现在不知道如何真正找到它们。
永远不要在脚本中使用ls
作为输入数据【参考方案5】:
同样,如果您更喜欢使用通配符 *
(不太像正则表达式建议),您可以使用 ls
和 -l
标志来每行列出一个文件(如 grep)和 @987654324 @标志就像你一样。然后您可以使用*.doc
指定要搜索的文件
IE。要么
ls -l -R *.doc
或者如果您希望它以更少的行列出文件。
ls -R *.doc
【讨论】:
你试过运行这个吗? mkdir tmp;光盘时间; mkdir a;触摸 a/a.doc; ls -l -R *.doc ls: 无法访问 '*.doc': 没有这样的文件或目录【参考方案6】:其他一些可以使用的方法:
echo *.pdf,docx,jpeg
stat -c %n * | grep 'pdf\|docx\|jpeg'
【讨论】:
【参考方案7】:ls
命令输出主要供人类阅读。对于自动处理的高级查询,您应该使用更强大的find
命令:
find /path -type f \( -iname "*.doc" -o -iname "*.pdf" \)
好像你有 bash 4.0++
#!/bin/bash
shopt -s globstar
shopt -s nullglob
for file in **/*.pdf,doc
do
echo "$file"
done
【讨论】:
它是 */.pdf */.doc - 如果没有它,您就不会递归到子目录 你可以做ls **/*.pdf,doc
或for file in **/*.pdf,doc
哇,我输入了三个星号,它用一个替换了它 - 将来会知道的。以上是关于如何在shell的递归目录中列出特定类型的文件?的主要内容,如果未能解决你的问题,请参考以下文章
在Databricks(DBFS)中递归列出目录和子目录的文件