在Linux中使用ls命令列出文件及其完整路径

61

很多人可能会觉得这是在重复问问题,但我已经查看了关于这个主题的所有问题,但都没有对我起作用。

我想使用ls命令打印特定文件格式的完整路径名,到目前为止我找到了一小段代码,可以打印目录中的所有文件,但不能打印完整路径。

for i in io.popen("ls /mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7"):lines() do
  if string.find(i,"%.*$") then 
     print(i) 
  end
end

这将打印出根目录和子目录中的所有文件。

输出:

  0020111118223425.lvf
  2012
  2012 (2009).mp4
  3 Idiots
  Aashiqui 2
  Agneepath.mkv
  Avatar (2009)
  Captain Phillips (2013)
  Cocktail

我希望得到如下输出:

  /mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/0020111118223425.lvf           [File in Root Directory]
  /mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/2012/2012.mkv
  /mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/2012 (2009).mp4                [File in Root Directory]
  /mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/3 Idiots/3 Idiots.mkv
  /mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/Aashiqui 2/Aashiqui 2.mkv
  /mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/Avatar (2009)/Avatar (2009).mkv
  /mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/Captain Phillips (2013).mkv
  /mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/Cocktail/Cocktail.mkv

编辑: 我已经使用了这个方法,但是在我的LUA代码中它不起作用。

当我在我的代码中使用时,它会显示错误的目录。

for i in io.popen("ls -d $PWD/* /mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7"):lines() do
    if string.find(i,"%.*$") then
      print("/mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/"..i)
    end
  end

无法在 "/mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7" 找到文件,而是打印出机器根目录的文件。


可能是重复问题[ls 命令:如何获得递归完整路径列表,每行一个文件?]的链接(https://dev59.com/K3I-5IYBdhLWcg3wm5vN)。 - Jeff Puckett
14个回答

79
您可以使用 <\/p>
  ls -lrt -d -1 "$PWD"/{*,.*}   

它还将捕获隐藏文件。


这将如何与我的代码配合工作。对于i in io.popen("ls /mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7"):lines() do的代码段,如果字符串中包含特定格式(%.*$),则会打印出该字符串。 - Prakash.DTI
1
@user1640175 for i in io.popen("ls -lrt -d -1 /mnt/mediashare/net/192.168.1.220_STORAGE_1d1b7/{*,.*}") - Totoro
1
当您无权访问目录并且无法展开*时,它无法正常工作。 (例如,sudo ls -d -1 /some/dir/i/cant/normally/access/* - davemyron
3
请在 $PWD ls -lrt -d -1 "$PWD"/{*,.*} 周围添加引号(修复带有空格的目录)。 - pevik
1
不适用于具有大量目录条目的目录/路径:-bash:/bin/ls:参数列表太长 - rtx13
1
而且这实际上不是ls,而是shell展开glob。正如rtx13所提到的,当shell无法执行时,这将会失败。 - grin

58

你可以尝试这个:

ls -d $PWD/*

6
为了考虑路径名包含空格的情况,可以将命令修改为:ls -d "$PWD"/* - user2188875
2
对于空目录,这会抛出“没有这样的文件或目录”的异常。我本来期望看到像在空目录上执行ls命令一样什么也不显示,但是没有异常。 - schreon
为什么需要 -d?对我来说就像这样 > $ ls pwd/* - undefined

28

只针对当前目录,以完整路径列出所有内容

find $PWD -maxdepth 1

与上面相同,但只匹配特定扩展名,不区分大小写(在这种情况下为.sh文件)

find $PWD -maxdepth 1 -iregex '.+\.sh'

$PWD 是当前目录的变量,可以替换为任何目录

mydir="/etc/sudoers.d/" ; find $mydir -maxdepth 1

maxdepth可以防止find进入子目录,比如你可以将其设置为"2"以列出子目录中的项目。如果需要递归,则只需将其删除即可。

要仅限于文件,可以使用-type f选项。

find $PWD -maxdepth 1 -type f

3
试过各种解决方案后,这是我唯一能找到的一个解决方案,它可以同时进行以下三个操作:1) 递归操作;2) 引用符号链接;3) 输出完整路径(我需要用于 | grep)。谢谢! - Autumn Leonard

6
您可以使用以下方法仅列出文件:
ls -d -1 $PWD/*.*

以下是列出目录的命令:
ls -d -1 $PWD/**

以下是列出所有文件/目录的命令:
ls -d -1 $PWD/**/*

更多有用的选项:

-d 列出目录而非其内容

-R 递归

-1 每行列出一个文件

-l 使用长格式列表

-a 列出所有以 . 和 .. 开头的条目

-A 列出所有但不列出隐含的 . 和 ..

要获取更多信息,只需输入以下内容即可

ls --help 

“ls -d -1 $PWD/*.*” 如何只打印文件?我有很多没有文件扩展名的文件。 - ychaouche

5

使用以下命令打印完整路径(也称为已解析路径):

realpath README.md

在交互模式下,您可以使用shell扩展来列出目录中所有文件及其完整路径:
realpath *

如果您正在编写Bash脚本,我猜您将拥有一个用于单个文件名的变量。

感谢VIPIN KUMAR指向相关的readlink命令。


3

这将递归地打印当前目录下的所有文件。

find "$PWD" | awk /.ogg/ # filter .ogg files by regex
find "$PWD" | grep .ogg  # filter .ogg files by term
find "$PWD" | ack .ogg   # filter .ogg files by regex/term using https://github.com/petdance/ack2

1
怎么样:
 du -a [-b] [--max-depth=N] 

那应该会给你一个相对于当前位置的文件和目录列表。如果你想要以字节为单位显示大小,可以添加“-b”参数。max-depth参数可能需要用来“鼓励”du深入到你的文件结构中,或者防止它过度扩散。你的经验可能会有所不同!-101-

1
尝试这个 -

readlink -f file.txt


0
这对我有用:
ls -rt -d -1 $PWD/{*,.*}

2
你能详细说明一下你代码中使用的标志吗? - mynetx

0

我曾经遇到过这个问题,我使用了以下命令:

ls -dl $PWD/* | grep $PWD

这个命令总是给我我想要的列表,但你的情况可能会有所不同。


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