如何在shell中的递归目录中列出特定类型的文件?

时间:2010-08-20 05:47:18

标签: linux unix shell command-line command

我们如何找到特定类型的文件,即嵌套目录中存在的doc pdf文件。

命令我试过了:

$ ls -R | grep .doc

但是如果有一个像alok.doc.txt这样的文件名,那么命令也会显示,这显然不是我想要的。我应该使用什么命令呢?

7 个答案:

答案 0 :(得分:60)

如果您对“ls”和“grep”更加舒适,可以使用grep命令中的正则表达式执行您想要的操作(结尾的'$'字符表示.doc必须位于行的末尾那将排除“file.doc.txt”):

ls -R |grep "\.doc$"

有关在the man中使用grep和正则表达式的更多信息。

答案 1 :(得分:31)

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

答案 2 :(得分:3)

可以使用的其他一些方法:

echo *.{pdf,docx,jpeg}

stat -c %n * | grep 'pdf\|docx\|jpeg'

答案 3 :(得分:2)

find . | grep "\.doc$"

这也将显示路径。

答案 4 :(得分: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"

希望您发现它有用。

Sid

答案 5 :(得分:0)

同样,如果您更喜欢使用通配符*(不像正则表达式建议),您可以使用ls同时使用-l标记每行列出一个文件(如grep)和你所拥有的-R标志。然后,您可以使用*.doc指定要搜索的文件 I.E.任

ls -l -R *.doc

或者如果您希望它以较少的行列出文件。

ls -R *.doc

答案 6 :(得分:0)

如果文件的扩展名与文件类型不匹配,则可以使用file实用程序。

find $PWD -type f -exec file -N \{\} \; | grep "PDF document" | awk -F: '{print $1}'

您可以使用要开始搜索的目录来代替$PWDfile甚至可以打印出PDF版本。