通过匹配路径来查找文件

通过匹配路径来查找文件

我有一个包含多个子目录的目录。每个子目录都包含一个具有相同名称的子目录。我想在命令行上生成所有这些文件的列表。例如,如果我有:

dir1/
    file1.txt
    subdir/
        relevant_file1.c
        relevant_file2.c
dir2/
    file2.txt
    subdir/
        relevant_file3.txt
        relevant_file4.java
dir3/
    subdir/
        relevant_file5.cpp
    irrelevant_subdir/
        unimportant_file.txt
dir4/
    subdir/

我想要得到以下输出:

dir1/subdir/relevant_file1.c
dir1/subdir/relevant_file2.c
dir2/subdir/relevant_file3.txt
dir2/subdir/relevant_file4.java
dir3/subdir/relevant_file5.cpp

我认为这不应该使用起来很困难find,但我还没能弄清楚。很难搜索这个问题,因为它太具体了,而且只搜索“通过匹配路径来查找文件”不会产生任何有用的结果。

答案1

尝试这个

find */subdir -type f

答案2

你实际上不需要find这个。一个简单的ls就可以了:

$ ls -1 */subdir/*
dir1/subdir/relevant_file1.c
dir1/subdir/relevant_file2.c
dir2/subdir/relevant_file3.txt
dir2/subdir/relevant_file4.java
dir3/subdir/relevant_file5.cpp

或者,如果你想要对这些文件执行某些操作而不只是列出它们,请使用 shell globs:

for file in */subdir/*; do command "$file"; done

当然,这将列出名为 的任何子目录中的所有内容subdir。包括目录、符号链接、设备文件或其他任何内容。如果您想将其限制为普通文件,请使用find "*/subdir" -type f 按照建议由@Carl,或者添加文件测试:

for file in */subdir/*; do [ -f "$file" ] && command "$file"; done

答案3

更好的解决方法find是使用-path选项。

find -path "*/subdir/*" -type f

当我们拥有更复杂的结构时它会更有用。例如:

.
├── dir1
│   ├── gooddir
│   │   └── subdir
│   │       └── file.txt
│   ├── irrelevant_subdir
│   │   └── file.txt
│   └── subdir
│       └── file.txt
└── dir2
    ├── gooddir
    │   └── subdir
    │       └── file.txt
    ├── irrelevant_subdir
    │   └── file.txt
    └── subdir
        └── file.txt

在上面的例子中,类似find */subdir -type f只查找第一个文件内的文件subdir。但是find -path "*/subdir/*" -type fwill 可以正常工作。

答案4

只需使用适当的工具:

locate "/subdir/"

您可能需要(重新)运行:

sudo updatedb

如果您需要刷新locate的数据库(例如,如果您想查找最近添加的文件),但它应该每天通过crontabs构建(如果当时电脑正在运行)

如果您需要初始的 updatedb,它可能看起来比特定的 find 慢,但最终它会更快,因为所有后续查询都是快速完成的。

相关内容