关于unix:在Linux CLI中以递归方式列出文件,其中包含相对于当前目录的路径

List files recursively in Linux CLI with path relative to the current directory

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

1
ls -LR | grep .txt

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

1
2
3
test1/file.txt
test2/file1.txt
test2/file2.txt

上面的代码将返回:

1
2
3
file.txt
file1.txt
file2.txt

我如何才能让它使用标准的Unix命令包含与当前目录相关的路径?


使用查找:

1
find . -name \*.txt -print

在使用gnu-find的系统上,像大多数gnu/linux发行版一样,您可以省略-print。


使用tree,带-f(全路径)和-i(无缩进线):

1
2
tree -if --noreport .
tree -if --noreport directory/

然后您可以使用grep过滤掉您想要的。

如果找不到该命令,可以安装它:

键入以下命令在rhel/centos和fedora linux上安装tree命令:

1
# yum install tree -y

如果您使用的是debian/ubuntu,mint linux在终端中键入以下命令:

1
$ sudo apt-get install tree -y


试试find。你可以在手册页上查到,但大致是这样的:

find [start directory] -name [what to find]

所以举个例子

find . -name"*.txt"

应该给你想要的。


您可以使用"查找"代替:

1
find . -name '*.txt'

这就是诀窍:

ls -R1 $PWD | while read l; do case $l in *:) d=${l%:};;"") d=;; *) echo"$d/$l";; esac; done | grep -i".txt"

但是,它通过对ls的解析来"犯罪",这被GNU和ghostscript社区认为是不好的形式。


要使用find命令获取所需文件的实际完整路径文件名,请将其与pwd命令一起使用:

1
find $(pwd) -name \*.txt -print


1
2
DIR=your_path
find $DIR | sed 's:""$DIR""::'

"sed"将从所有"find"结果中删除"your_path"。你得到的是相对于"dir"路径的。


如果您想保留输出中包含ls(如文件大小等)的详细信息,那么应该可以这样做。

1
sed"s|<OLDPATH>|<NEWPATH>|g" input_file > output_file

在文件系统上查找名为"filename"的文件,从根目录"/"开始搜索。"文件名"

1
find / -name"filename"

您可以创建一个shell函数,例如在您的.zshrc.bashrc中:

1
2
3
4
5
6
7
8
9
filepath() {
    echo $PWD/$1
}

filepath2() {
    for i in $@; do
        echo $PWD/$i
    done
}

显然,第一个只对单个文件有效。


下面是一个Perl脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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();

用途:

1
ls -LR | perl format_ls-LR.pl


在fish shell中,可以这样做以递归方式列出所有pdf,包括当前目录中的pdf:

1
$ ls **pdf

如果需要任何类型的文件,只需删除"pdf"。


您可以这样实现这个功能首先,使用ls命令指向目标目录。稍后使用find命令过滤结果。从您的情况来看,听起来-文件名总是以一个词开头file***.txt

1
ls /some/path/here | find . -name 'file*.txt'   (* represents some wild card search)