如何使用绝对路径列出目录中的所有文件

ara*_*ert 41 command-line ls filenames

我需要一个文件(最好是 .list 文件),其中包含目录中每个文件的绝对路径。

示例 dir1:file1.txt file2.txt file3.txt

listOfFiles.list

/Users/haddad/dir1/file1.txt
/Users/haddad/dir1/file2.txt
/Users/haddad/dir1/file3.txt
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 linux/mac 中完成这个?

And*_*ton 50

您可以使用查找。假设您只需要常规文件,您可以执行以下操作:

find /path/to/dir -type f > listOfFiles.list
Run Code Online (Sandbox Code Playgroud)

如果需要其他类型的文件,可以适当调整类型参数。

  • +1 指出了一个更面向未来的解决方案,即`ls`。这个 `find` 确实递归了子目录,对于非递归你需要在 `-type` 参数之前添加 `-maxdepth 1`。 (11认同)

Com*_*rse 38

ls -d "$PWD"/* > listOfFiles.list
Run Code Online (Sandbox Code Playgroud)

  • 如果目录中有数千个文件,这将失败,即足以超过最大命令行大小(更可能是因为 shell 正在使用完整路径扩展文件名)。@Andy Dalton 的 `find` 答案是一个更好的解决方案,因为无论列出多少文件它都不会失败。 (10认同)
  • 仅当输出到终端时才需要 @MelBurslan 的添加。`ls` 检测输出是文件还是终端。 (7认同)
  • 该命令适用于**任何** Linux 或 UNIX 操作系统。如果你想每行获取一个文件,你需要使用`ls -d -1 $PWD/*` (4认同)

Sté*_*las 14

请注意,在:

ls -d "$PWD"/* > listOfFiles.list
Run Code Online (Sandbox Code Playgroud)

它是计算目录中(非隐藏)文件列表并将列表传递给ls. ls只需在此处打印该列表,您也可以这样做:

printf '%s\n' "$PWD"/*
Run Code Online (Sandbox Code Playgroud)

请注意,它不包括隐藏文件,包括任何类型的文件(包括目录),如果目录中没有非隐藏文件,则在 POSIX/csh/rc shell 中,您将获得/current/wd/*作为输出。此外,由于换行符与文件路径中的任何字符一样有效,如果您用换行符分隔文件路径,您将无法使用该结果文件可靠地返回到文件列表。

使用zsh外壳,您可以改为:

print -rNC1 $PWD/*(ND-.) > listOfFiles.list
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • -rC1r1 Column上打印aw 。
  • -N, 输出记录以 NUL 分隔而不是换行分隔(行),因为 NUL 是唯一在文件名中找不到的字符。
  • N: 如果没有匹配的文件 ( nullglob),则扩展为空
  • D: 包括隐藏文件 ( dotglob)。
  • -.:在符号链接解析 ( )之后仅包含常规文件.( -)。

然后,您可以执行以下操作:

xargs -0 rm -f -- < listOfFiles.list
Run Code Online (Sandbox Code Playgroud)

例如,删除这些文件。

您还可以使用:Pglob 限定符中的修饰符来获取从 globrealpath()扩展的文件的等效项(获取排除任何符号链接组件的完整路径):

print -rNC1 -- *(ND-.:P) > listOfFiles.list
Run Code Online (Sandbox Code Playgroud)

  • 使用 `printf` 有一个额外的好处,如果你有数千个文件,你不会得到“命令行太长”错误,因为 `printf` 不是作为单独的进程运行的。 (3认同)
  • @AdrianPronk,是的,除了在不内置 `printf` 的 shell 中,如 `pdksh` 及其一些衍生物或大多数版本的 Bourne shell。与 `ls -d` 相比的一个缺点是,如果那里没有非隐藏文件,它会打印 `/path/to/*` 而 `ls` 会给你一个关于该文件不存在的错误。 (2认同)

小智 11

只查看常规文件——

find "$PWD" -type f  > output
Run Code Online (Sandbox Code Playgroud)


Edu*_*scu 7

另一种方式tree,这里没有提到,它是递归的,与 find 或 ls 不同,你没有任何错误(如:Permission deniedNot a directory),如果你想将文件提供给xargs或其他命令,你还可以获得绝对路径

tree -fai /pathYouWantToList >listOfFiles.list
Run Code Online (Sandbox Code Playgroud)

选项含义:

-a     All  files  are  printed.  By default tree does not print hidden files (those beginning with a dot
       `.').  In no event does tree print the file system constructs `.'  (current  directory)  and  `..'
       (previous directory).

-i     Makes tree not print the indentation lines, useful when used in conjunction with the -f option.

-f     Prints the full path prefix for each file.
Run Code Online (Sandbox Code Playgroud)

安装tree

sudo apt install tree在 Ubuntu/Debian 上

sudo yum install tree在 CentOS/Fedora 上

sudo zypper install tree在 OpenSUSE 上

  • Mac 上的“brew 安装树” (2认同)