我有一个包含多个子目录的目录。每个子目录都包含一个具有相同名称的子目录。我想在命令行上生成所有这些文件的列表。例如,如果我有:
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 f
will 可以正常工作。
答案4
只需使用适当的工具:
locate "/subdir/"
您可能需要(重新)运行:
sudo updatedb
如果您需要刷新locate的数据库(例如,如果您想查找最近添加的文件),但它应该每天通过crontabs构建(如果当时电脑正在运行)
如果您需要初始的 updatedb,它可能看起来比特定的 find 慢,但最终它会更快,因为所有后续查询都是快速完成的。