如何在 Linux 中生成带有其绝对路径的文件列表?

2024-10-23 08:47:00
admin
原创
71
摘要:问题描述:我正在编写一个以文件路径作为输入的 shell 脚本。因此,我需要生成具有完整路径的递归文件列表。例如,文件bar具有以下路径:/home/ken/foo/bar 但据我所知,ls和find都只提供相对路径列表:./foo/bar (from the folder ken) find这似乎是一个...

问题描述:

我正在编写一个以文件路径作为输入的 shell 脚本。

因此,我需要生成具有完整路径的递归文件列表。例如,文件bar具有以下路径:

/home/ken/foo/bar

但据我所知,lsfind都只提供相对路径列表:

./foo/bar   (from the folder ken)

find这似乎是一个显而易见的要求,但我在手册页中看不到任何内容ls

如何在 shell 中生成文件列表(包括它们的绝对路径)?


解决方案 1:

如果你给出find绝对路径,它将打印绝对路径。例如,要查找当前目录中的所有 .htaccess 文件:

find "$(pwd)" -name .htaccess

或者如果你的 shell 扩展$PWD到当前目录:

find "$PWD" -name .htaccess

find只是将给定的路径添加到该路径的文件的相对路径中。

pwd -P如果您想解析当前目录中的符号链接,Greg Hewgill还建议使用。

解决方案 2:

readlink -f filename 

给出完整的绝对路径。但如果文件是符号链接,您将获得最终解析的名称。

解决方案 3:

将其用于目录(bash 中需要/后面的部分来将其限制为目录):**

ls -d -1 "$PWD/"**/

对于当前目录下的文件和目录,其名称包含.

ls -d -1 "$PWD/"*.*

一切都如此:

ls -d -1 "$PWD/"**/*

摘自此处
http://www.zsh.org/mla/users/2002/msg00033.html

在 bash 中,**如果启用,则是递归的shopt -s globstar

解决方案 4:

您可以使用

find $PWD 

在 bash 中

解决方案 5:

ls -d "$PWD/"*

这只查找当前目录。如​​果包含空格,则用引号括住“$PWD”。

解决方案 6:

你可以做

ls -1 | xargs realpath

如果需要指定绝对路径或相对路径,也可以这样做

ls -1 $FILEPATH | xargs realpath

解决方案 7:

命令: ls -1 -d "$PWD/"*

这将提供如下所示的文件的绝对路径。

[root@kubenode1 ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt

解决方案 8:

尝试一下:

find "$PWD"/

您将获得工作目录中的绝对路径列表

解决方案 9:

Matthew 的上述选择$PWD很不错。如果您希望 find 仅打印文件,那么您还可以添加 -type f 选项以仅搜索普通文件。其他选项包括“d”(仅用于目录)等。因此,对于您的情况,情况如下(如果我只想搜索带有 .c 扩展名的文件):

find $PWD -type f -name "*.c" 

或者如果你想要所有文件:

find $PWD -type f

注意:您不能为上述命令创建别名,因为当 bash 设置别名时,$PWD 会自动完成到您的主目录。

解决方案 10:

如果你给 find 命令指定了绝对路径,它会以绝对路径输出结果。因此,如果你在 Ken 目录中输入:

find /home/ken/foo/ -name bar -print    

(而不是相对路径find . -name bar -print

你应该得到:

/home/ken/foo/bar

因此,如果您想要一个ls -l并让其返回绝对路径,您只需告诉 find 命令ls -l对其找到的任何内容执行一个。

find /home/ken/foo -name bar -exec ls -l {} ; 

{}注意:和之间有一个空格;

你会得到类似这样的结果:

-rw-r--r--   1 ken admin       181 Jan 27 15:49 /home/ken/foo/bar

如果您不确定文件在哪里,您可以随时更改搜索位置。只要搜索路径以“/”开头,您就会得到一个绝对路径。如果您正在搜索一个位置(如/),您将会得到很多权限被拒绝的错误,那么我建议重定向标准错误,这样您就可以真正看到查找结果:

find / -name bar -exec ls -l {} ; 2> /dev/null

2>是 Borne 和 Bash shell 的语法,但不适用于 C shell。它也可能适用于其他 shell,但我只确定它在 Bourne 和 Bash 中有效)。

解决方案 11:

只是一种替代方案

ls -d "$PWD/"* 

为了确定这*是壳层扩展,因此

echo "$PWD/"*

会做同样的事情(缺点是您不能用-1新行而不是空格来分隔)。

解决方案 12:

如果你需要当前目录和子目录中所有文件的列表

find $PWD -type f

如果您只需要当前目录中所有文件的列表

find $PWD -maxdepth 1 -type f

解决方案 13:

fd

使用fd(替代find),使用以下语法:

fd . foo -a

.搜索模式在哪里,foo根目录在哪里。

例如,要递归列出所有文件etc,请运行:fd . /etc -a

-a,--absolute-path 显示绝对路径而不是相对路径

解决方案 14:

递归查找 jar 文件并打印绝对路径

ls -R |grep ".jar$" | xargs readlink -f                                                                                                                                                                                                                                                               
/opt/tool/dev/maven_repo/com/oracle/ojdbc/ojdbc8-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/ons-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/oraclepki-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/osdt_cert-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/osdt_core-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/simplefan-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/ucp-19.3.0.0.jar

解决方案 15:

您可能想尝试一下。

for name in /home/ken/foo/bar/*
do
    echo $name
done

您可以使用for循环并且echo简单地无需来获取绝对路径find

解决方案 16:

如果您想要一个在函数中运行良好的动态解决方案,则此方法最有效

lfp ()
{
  ls -1 $1 | xargs -I{} echo $(realpath $1)/{}
}

解决方案 17:

lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }

解决方案 18:

下面是一个打印出不带额外句点的列表的示例,还演示了如何搜索文件匹配项。希望这对您有所帮助:

find . -type f -name "extr*" -exec echo `pwd`/{} ; | sed "s|./||"

解决方案 19:

这对我有用。但它没有按字母顺序列出。

find "$(pwd)" -maxdepth 1

此命令按字母顺序列出并列出隐藏文件。

ls -d -1 "$PWD/".*; ls -d -1 "$PWD/"*;

解决方案 20:

stat

单个文件的绝对路径:

stat -c %n "$PWD"/foo/bar

解决方案 21:

这将提供规范路径(将解析符号链接):realpath FILENAME

如果您想要符号链接本身的规范路径,那么:realpath -s FILENAME

解决方案 22:

大多数(如果不是全部)建议的方法都会导致路径无法直接用于其他终端命令(如果路径包含空格)。理想情况下,结果将在前面加上斜杠。这在 macOS 上对我有用:

find / -iname "*SEARCH TERM spaces are okay*" -print 2>&1  | grep -v denied |grep -v permitted |sed -E 's/ /\\ /g'

解决方案 23:

for p in <either relative of absolute path of the directory>/*; do
    echo $(realpath -s $p)
done

解决方案 24:

这是一个更短、更方便的解决方案:

find ~+
  • ~+意思是"$PWD",但它是自动引用的,不需要在键盘上输入符号

  • 添加-name .htaccess-maxdepth 1如有必要

与其他答案不同,您可以为此命令创建别名:

alias fa='find ~+'
  • 输入这个~/.bashrc,你只需要输入 2 个字母

  • 或者,您可以在别名末尾添加-name并像fa .htaccess

  • 单引号防止过早扩展

  • fa 表示查找绝对路径

解决方案 25:

在 Linux 中,递归文件可以通过多种方式列出。这里我分享一个脚本来清除/var/log/目录中的所有文件日志(仅限文件),并再次检查最近哪个日志文件已进入。

第一的:

find /var/log/ -type f  #listing file recursively 

第二:

for i in $(find $PWD -type f) ; do cat /dev/null > "$i" ; done #empty files recursively 

第三次使用:

ls -ltr $(find /var/log/ -type f ) # listing file used in recent

注意:对于目录位置,您也可以传递$PWD而不是/var/log

解决方案 26:

如果你没有符号链接,你可以尝试

tree -iFL 1 [DIR]

-i使树形打印文件名在每一行中不带树结构。

-f使树打印每个文件的完整路径。

-L 1避免树的递归。

解决方案 27:

编写一个小函数

lsf() {
ls `pwd`/$1
}

然后你可以使用

lsf test.sh 

它给出了完整的路径

/home/testuser/Downloads/test.sh

解决方案 28:

我使用以下命令在 txt 文件中列出目录中文件的绝对路径:

find "$PWD" -wholename '*.JPG' >test.txt

解决方案 29:

以下是带有完整路径的“ls -l”查找版本:

find "$PWD" -printf "%M    %s    %u    %g    %l    %p    
" -maxdepth 10 2>/dev/null

输出:

-rw-------      6239    u0_a106 u0_a106         /mnt/androidwritable/0/emulated/0/oenv.sh
-rw-------      5       u0_a106 u0_a106         /mnt/androidwritable/0/emulated/0/step3.txt
-rw-------      23716   u0_a106 u0_a106         /mnt/androidwritable/0/emulated/0/c0c7e91c6f39f547289c50eed7468f85.bin.tmp
-rw-------      524     u0_a106 u0_a106         /mnt/androidwritable/0/emulated/0/e578ae66bb10a13eff3e6734bd3e9962.sh.tmp
-rw-------      528     u0_a106 u0_a106         /mnt/androidwritable/0/emulated/0/e3528f9d0038eb9bb9f923989b8e70b9.sh.tmp
-rw-------      524     u0_a106 u0_a106         /mnt/androidwritable/0/emulated/0/ea24981a4e0df3ab52b2dcb247d010d1.sh.tmp
-rw-------      28812   u0_a106 u0_a106         /mnt/androidwritable/0/emulated/0/edfc87310f01af229bd4d1734fe0fbab.bin.tmp
-rw-------      528     u0_a106 u0_a106         /mnt/androidwritable/0/emulated/0/19646e6b5c9d1afd369c8e5620c85a86.sh.tmp
-rw-------      528     u0_a106 u0_a106         /mnt/androidwritable/0/emulated/0/e9ac90448e68032aae050a489c214071.sh.tmp
-rw-------      395     u0_a106 u0_a106         /mnt/androidwritable/0/emulated/0/469b78eaa19f3c69a0e55077f88bf817.sh

解决方案 30:

ls -1 | awk  -vpath=$PWD/ '{print path$1}'
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用