在Linux命令行中以相对于当前目录的路径递归列出文件列表

254

这与这个问题类似,但我想在Unix中包括相对于当前目录的路径。如果我执行以下操作:

ls -LR | grep .txt

它不包括完整路径。例如,我有以下目录结构:

test1/file.txt
test2/file1.txt
test2/file2.txt

上述代码将返回:

file.txt
file1.txt
file2.txt

如何使用标准Unix命令,使它包含相对于当前目录的路径?


7
这只是表明ls缺少这个功能。 - Arjun Singri
1
很遗憾,所有这些解决方案都需要使用“find”或“tree”。我正在通过ssh连接到一个安卓设备,似乎只有“ls”,没有这些其他工具 :/ - Ponkadoodle
14个回答

345

使用 find 方法:

find . -name \*.txt -print

在使用GNU find的系统上,例如大多数GNU/Linux发行版,您可以省略-print。


13
而且就此而言,您可以省略“。” - Adam Mitz
10
对于绝对路径,请使用find $(pwd) -name \*.txt。 (说明:该命令是寻找当前目录下所有扩展名为txt的文件,$(pwd)表示当前所在目录的绝对路径。) - Zags
3
如果模式中包含部分目录名称,应该使用 -path "*docs/*.txt" 而不是 -name-wholename-path相同。 - dashesy
9
使用“-type f”只返回文件而不包括目录、符号链接等。 - user
2
-name "*.txt" 不会 匹配 file.TXT —— 请始终使用 -iname "*.txt",它是不区分大小写的。 - ccpizza
更简单的方法:find -name "*.txt"至少在Ubuntu系统上有效,我猜这也意味着它在Debian系统上也有效。 - Olof Bjarnason

77

使用 tree 命令,加上参数 -f(显示完整路径)和 -i(不要显示缩进行):

tree -if --noreport .
tree -if --noreport directory/

您可以使用grep过滤出您想要的内容。


如果未找到该命令,您可以进行安装:

输入以下命令以在RHEL/CentOS和Fedora Linux上安装tree命令:

# yum install tree -y
如果您使用的是Debian/Ubuntu、Mint Linux,请在终端中输入以下命令:
$ sudo apt-get install tree -y

2
有没有任何设置可以仅列出文件并排除文件夹? - thebugfinder

27

试试find命令。你可以在man手册中精确查找,但它有点像这样:

find [起始目录] -name [要查找的内容]

所以对于你的示例:

find . -name "*.txt"

应该会给你想要的结果。


12
您可以使用find代替:
find . -name '*.txt'

7
使用find命令获取所需文件的实际路径名,并与pwd命令一起使用:
find $(pwd) -name \*.txt -print

6
这就是解决问题的方法: ls -R1 $PWD | while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done | grep -i ".txt" 但是,这种方法“犯规”了GNU和Ghostscript社区不赞成的解析方式。

2
@CAFEBABE:解析“ls”命令的结果通常会导致错误,因此这被认为是禁忌。该句子试图指出这一点,并且其中还有一个笑话,我已经将其删除。 - Adam Katz

4
DIR=your_path
find $DIR | sed 's:""$DIR""::'

'sed' 将从所有 'find' 的结果中删除 'your_path'。您将收到相对于 'DIR' 路径的结果。


这正是我需要的,但它仍然为我输出完整路径? - v3nt
1
查找 /tmp 目录下的文件并使用 sed 命令将路径中的 "/tmp" 替换为空,最后使用 more 命令进行分页显示。 - Kieren Dixon

1
这是一个Perl脚本:
sub format_lines($)
{
    my $refonlines = shift;
    my @lines = @{$refonlines};
    my $tmppath = "-";

    foreach (@lines)
    {
        next if ($_ =~ /^\s+/);
        if ($_ =~ /(^\w+(\/\w*)*):/)
        {
            $tmppath = $1 if defined $1;    
            next;
        }
        print "$tmppath/$_";
    }
}

sub main()
{
        my @lines = ();

    while (<>) 
    {
        push (@lines, $_);
    }
    format_lines(\@lines);
}

main();

用法:

ls -LR | perl format_ls-LR.pl

这是一个糟糕的Perl程序。它可能比实际需要的长和复杂2-3倍。 - Brad Gilbert

1
从根目录“/”开始搜索您文件系统中名为“filename”的文件。 “filename”是文件名。
find / -name "filename" 

1
fish shell中,您可以执行以下操作以递归列出所有PDF文件,包括当前目录中的文件:
$ ls **pdf

如果你想要任何类型的文件,只需删除“pdf”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接