当前位置: 首页 > 面试题库 >

Shell:在目录下的列表中查找文件

爱唯
2023-03-14
问题内容

我有一个包含约1000个文件名的列表,可在目录及其子目录下进行搜索。有数百个具有超过1,000,000个文件的子目录。以下命令将运行find 1000次:

cat filelist.txt | while read f; do find /dir -name $f; done

有更快的方法吗?


问题答案:

如果filelist.txt每行只有一个文件名:

find /dir | grep -f <(sed 's@^@/@; s/$/$/; s/\([\.[\*]\|\]\)/\\\1/g' filelist.txt)

(该-f选项意味着grep搜索给定文件中的所有模式。)

的说明<(sed 's@^@/@; s/$/$/; s/\([\.[\*]\|\]\)/\\\1/g' filelist.txt)

<( ... )被称为过程subsitution,并且有点类似$( ... )。这种情况是等效的(但是使用流程替换更整洁,可能更快一些):

sed 's@^@/@; s/$/$/; s/\([\.[\*]\|\]\)/\\\1/g' filelist.txt > processed_filelist.txt
find /dir | grep -f processed_filelist.txt

调用sed运行命令s@^@/@s/$/$/s/\([\.[\*]\|\]\)/\\\1/g在命令的每一行上将其filelist.txt打印出来。这些命令将文件名转换为与grep更好地兼容的格式

  • s@^@/@表示/在每个文件名之前放置一个。(^在正则表达式中表示“行首”)
  • s/$/$/表示$在每个文件名的末尾放置a 。(第一个$表示“行尾”,第二个只是字面量$,然后由grep解释为“行尾”)。

这两个规则的结合意味着grep将只寻找像.../<filename>这样的匹配,因此a.txt不匹配./a.txt.backup./abba.txt

s/\([\.[\*]\|\]\)/\\\1/g``\在每次出现. [
]或之前放置一个*。Grep使用正则表达式,这些字符被认为是特殊字符,但我们希望它们是普通字符,因此我们需要对其进行转义(如果不对它们进行转义,则文件名a.txt将会与匹配abtxt)。

举个例子:

$ cat filelist.txt
file1.txt
file2.txt
blah[2012].txt
blah[2011].txt
lastfile

$ sed 's@^@/@; s/$/$/; s/\([\.[\*]\|\]\)/\\\1/g' filelist.txt
/file1\.txt$
/file2\.txt$
/blah\[2012\]\.txt$
/blah\[2011\]\.txt$
/lastfile$

然后,Grep在搜索的输出时会将输出的每一行用作模式find



 类似资料:
  • 本文向大家介绍Linux Shell在目录下使用for循环结合if查找文件的巧用,包括了Linux Shell在目录下使用for循环结合if查找文件的巧用的使用技巧和注意事项,需要的朋友参考一下 1.for循环对目录做遍历,if判断文件是否为要查找的文件。 示例1: 示例2:对脚本做修改,让用户自定义要查找的文件以及在那个目录下查找 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或

  • 问题内容: 我正在编写一个Python备份脚本,需要在目录(及其子目录)中找到最旧的文件。我还需要仅将其过滤为* .avi文件。 该脚本将始终在Linux计算机上运行。有什么方法可以在Python中完成,还是运行一些Shell命令会更好? 目前,我正在努力获取特定分区上的可用空间,如果可用空间不足5 GB,我想开始删除最旧的文件,直到满足该条件为止。 问题答案: 嗯 Nadia的答案是接近你什么

  • 问题内容: 我正在尝试将一个自动化脚本输入到最近创建的文件夹中。 我下面有一些代码 我不确定如何从现在开始检查最新的时间戳。有任何想法吗? 谢谢 问题答案: 还有的“创建时间”在大多数OS /文件系统没有实际的跟踪:你得到的是一个文件或目录的时间 修改 (因此,例如创建一个目录中的文件更新该目录的修改时间) -和,如果提供,则表示最新的inode更改时间(因此将通过创建或删除子目录来更新)。 假设

  • 问题内容: 我试图找到一种方法来检测何时将闪存驱动器插入计算机。到目前为止,我发现的解决方案是轮询更改。这确实告诉我何时插入了闪存驱动器,但是据我所知,没有办法为其找到位置。而双方似乎非常不可靠作为其返回值是实现特定的,但他们似乎是可能返回的任何相关信息,可能有助于找到该目录的唯一方法。 考虑到这一点,以下代码: 给我这个输出: 事实证明,返回驱动器的格式并返回该驱动器的设备文件的位置。据我所知,

  • 问题内容: 我知道当您在shell上时,只能使用在PATH上某个目录中可以找到的命令。即使我也不知道如何查看PATH变量上的目录(这是另一个可以回答的好问题),我想知道的是: 我来壳写: 我想知道shell上的命令,该命令可以告诉我该命令位于何处。换句话说,此“可执行文件”位于何处? 就像是: 任何人? 问题答案: 如果您使用的是Bash或zsh,请使用以下命令: 这将显示目标是内置,函数,别名还

  • 本小节介绍如何使用命令列出当前所在目录中所有文件和目录的列表,另外还介绍使用不同的命令参数筛选和限制展示出来的列表。 1. 列出目录列表 显示当前目录下的文件目录列表命令: ls 执行结果如下: Tips:ls 命令列出来的目录排序默认是按字母的列排序。 2. 列出有标记的目录列表 使用 ls -F 命令可以在列表出来的文件后面加上一个标识,这样再使用 ls 命令列出文件列表时,能快速知道列出的