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。
使用
1 2 | tree -if --noreport . tree -if --noreport directory/ |
然后您可以使用
如果找不到该命令,可以安装它:
键入以下命令在rhel/centos和fedora linux上安装tree命令:
1 | # yum install tree -y |
如果您使用的是debian/ubuntu,mint linux在终端中键入以下命令:
1 | $ sudo apt-get install tree -y |
试试
所以举个例子
应该给你想要的。
您可以使用"查找"代替:
1 | find . -name '*.txt' |
这就是诀窍:
但是,它通过对
要使用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函数,例如在您的
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命令过滤结果。从您的情况来看,听起来-文件名总是以一个词开头
1 | ls /some/path/here | find . -name 'file*.txt' (* represents some wild card search) |