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


30

我需要一个文件(最好是.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

如何在linux / mac中完成此操作?

Answers:


30
ls -d "$PWD"/* > listOfFiles.list

这将在Red Hat Linux中工作吗?
arabian_albert

4
该命令可在任何 Linux或UNIX操作系统中使用。如果您想每行获取一个文件,则需要使用ls -d -1 $PWD/*
MelBurslan,2016年

1
如果您的文件名太长或终端宽度很窄,可以,但是请说您最大化了终端窗口以占据整个屏幕,或者说您的文件名(包括路径)真的很短,那将不成立真正。-1选项保证每行获得一个文件名
MelBurslan 2016年

7
仅当输出到终端时才需要@MelBurslan的加法。ls检测输出是到文件还是终端。
Runium

9
如果目录中有成千上万个文件(即足以超过最大命令行大小),则此操作将失败(由于Shell扩展了具有完整路径的文件名,因此更有可能)。@Andy Dalton的find答案是一个更好的解决方案,因为无论列出多少文件,它都不会失败。
cas

33

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

find /path/to/dir -type f > listOfFiles.list

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


7
+1可以指向更适合未来的解决方案ls。这find确实会递归子目录,对于非递归,您需要-maxdepth 1-type参数前添加。
kubanczyk

@AndyDalton如何在bash中获得相同的结果
Kasun Siyambalapitiya

13

注意在:

ls -d "$PWD"/* > listOfFiles.list

它是外壳程序,用于计算目录中(非隐藏)文件的列表并将该列表传递给lsls只在此处打印该列表,因此您也可以执行以下操作:

printf '%s\n' "$PWD"/*

3
使用printf具有额外的好处,如果您有成千上万个printf未作为单独进程运行的文件,则不会出现“命令行太长”错误。
阿德里安·普龙克

2
@AdrianPronk,是的,除了printf不是内置的shell pdksh及其某些派生版本或Bourne shell的大多数版本。ls -d与之相比的一个缺点是,如果其中没有未隐藏的文件,它将在打印的/path/to/*同时ls显示有关该文件不存在的错误。
斯特凡Chazelas

10

要仅查看常规文件-

find "$PWD" -type f  > output


3

另一种方法tree,这里没有提到,它是递归的,并且与find或ls不同,它没有任何错误(例如:Permission deniedNot a directory),如果要将文件馈送到xargs或其他命令,您也可以获得绝对路径

tree -fai /pathYouWantToList >listOfFiles.list

选项含义:

-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.

要安装tree

sudo apt install tree 在Ubuntu / Debian上

sudo yum install tree 在CentOS / Fedora上

sudo zypper install tree 在OpenSUSE上


1
树:找不到命令
rogerdpack

@rogerdpack sudo apt install tree在OpenSUSE的sudo yum install treeCentOS 上的Ubuntu 上 sudo zypper install tree
Eduard Florinescu

1
brew install tree在Mac上
oOEric

2

在过去的Linux环境中,我有一条resolve命令可以标准化路径,包括将相对路径转换为绝对路径。我现在找不到它,所以也许它是由该组织中的某人编写的。

您可以使用Python或Perl标准库(可能还有其他语言)中的函数制作自己的脚本。

resolve.py

#!/bin/env python

import sys
import os.path

for path in sys.argv:
    print os.path.abspath(path)

resolve.pl

#!/bin/env perl

use warnings;
use Cwd qw ( abs_path );

foreach (@ARGV) {
    print abs_path($_), "\n";
}

然后,您将使用以下方法解决您的问题:

resolve.py * > listOfFiles.list

使用此命令,您还可以执行以下操作:

cd /root/dir1/dir2/dir3
resolve.py ../../dir4/foo.txt
# prints /root/dir1/dir4/foo.txt
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.