通过匹配路径查找文件

Mee*_*ies 7 command-line bash directory find

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

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/
Run Code Online (Sandbox Code Playgroud)

我想要以下输出:

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
Run Code Online (Sandbox Code Playgroud)

我认为使用应该不会太难find,但我不太能弄明白。这个问题很难搜索,因为它太具体了,仅仅搜索“通过匹配路径查找文件”不会产生任何有用的东西。

小智 8

尝试这个

find */subdir -type f
Run Code Online (Sandbox Code Playgroud)


ter*_*don 8

你实际上不需要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
Run Code Online (Sandbox Code Playgroud)

或者,如果您想对这些文件做一些事情而不只是列出它们,请使用 shell globs:

for file in */subdir/*; do command "$file"; done
Run Code Online (Sandbox Code Playgroud)

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

for file in */subdir/*; do [ -f "$file" ] && command "$file"; done
Run Code Online (Sandbox Code Playgroud)