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


224

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

ls -LR | grep .txt

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

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

上面的代码将返回:

file.txt
file1.txt
file2.txt

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


4
这仅表明ls缺少此功能。
Arjun Singri

1
所有这些解决方案都需要find或遗憾的是tree。我要进入一个似乎只有android设备ls,而没有其他任何工具的Android设备:/
Ponkadoodle 2015年

Answers:


304

使用查找:

find . -name \*.txt -print

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


11
...就此而言,您可以省略“。”
亚当·米兹

7
对于绝对路径,请使用find $(pwd) -name \*.txt
Zags

2
如果pattern具有目录的一部分,则应使用-path "*docs/*.txt"代替-name-wholename-path
dashesy 2016年

9
使用-type f仅返回文件,而不是目录,符号链接,等等
用户

2
-name "*.txt"匹配file.TXT-始终使用-iname "*.txt"不区分大小写的代替。
ccpizza

73

使用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

25

尝试find。您可以在手册页中完全查找它,但是有点像这样:

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

所以你的例子

find . -name "*.txt"

应该给你你想要的。



5

达到目的:

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

但这是通过“解析”来实现的ls,但是GNU和Ghostscript社区认为解析是不好的形式。


2
@CAFEBABE:解析结果被认为是忌讳的,ls因为它通常会导致错误。有问题的句子正试图指出这一点。我也删除了一个玩笑。
亚当·卡兹

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

“ sed”将从所有“查找”结果中删除“ your_path”。而且您相对于“ DIR”路径而言。


这正是我所需要的,但是它仍然为我提供了完整的途径吗?
v3nt 2012年

1
不要使用撇号-find / tmp | sed s:“ / tmp” :: | 更多
Kieren Dixon 2012年

4

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

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

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程序。它的长度和复杂度可能是所需的两倍至三倍。
布拉德·吉尔伯特

1

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

filepath() {
    echo $PWD/$1
}

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

很明显,第一个仅适用于单个文件。


1

从根目录“ /”开始搜索,在文件系统上找到名为“文件名”的文件。“文件名”

find / -name "filename" 

1

如果您想保留输出中带有文件大小等ls的详细信息,则应该可以使用。

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

1

fish shell中,您可以执行此操作以递归方式列出所有pdf,包括当前目录中的pdf:

$ ls **pdf

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


0

您可以像这样实现此功能。
首先,使用指向目标目录的ls命令。以后使用find命令从中筛选结果。从您的情况来看,听起来像-文件名始终以单词开头 file***.txt

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

0

在我的情况下,使用树命令

相对路径

tree -ifF ./dir | grep -v '^./dir$' | grep -v '.*/$' | grep '\./.*' | while read file; do
  echo $file
done

绝对路径

tree -ifF ./dir | grep -v '^./dir$' | grep -v '.*/$' | grep '\./.*' | while read file; do
  echo $file | sed -e "s|^.|$PWD|g"
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.