我需要一个文件(最好是 .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 中完成这个任务?
答案1
您可以使用查找。假设您只需要常规文件,您可以执行以下操作:
find /path/to/dir -type f > listOfFiles.list
如果您需要其他类型的文件,可以适当调整类型参数。
答案2
ls -d "$PWD"/* > listOfFiles.list
答案3
请注意,在:
ls -d "$PWD"/* > listOfFiles.list
它是计算目录中(非隐藏)文件列表并将列表传递给ls
.ls
只需在此处打印该列表,因此您也可以这样做:
printf '%s\n' "$PWD"/* > listOfFiles.list
请注意,它不包括隐藏文件,包括任何类型的文件(包括目录),如果目录中没有非隐藏文件,在 Bourne/POSIX/rc 类 shell 中,您将得到/current/wd/*
输出。此外,由于换行符与文件路径中的任何字符一样有效,因此如果您使用换行符分隔文件路径,则将无法使用该结果文件可靠地返回到文件列表。
使用zsh
shell,你可以这样做:
print -rNC1 $PWD/*(ND-.) > listOfFiles.list
在哪里:
-rC1
在柱上打印r
aw1
C
。-N
,输出记录以 NUL 分隔而不是换行符分隔(行),因为 NUL 是唯一在文件名中找不到的字符。N
: 如果没有匹配的文件则展开为空 (nullglob
)D
: 包含隐藏文件 (dotglob
)。-.
: 仅包括常规的.
符号链接解析 ( ) 后的文件 ( )-
。
然后,您就可以执行以下操作:
xargs -0 rm -f -- < listOfFiles.list
例如,删除这些文件。
您还可以在 glob 限定符中使用修饰符来获取从 glob 扩展的文件上:P
的等效项(获取免除任何符号链接组件的完整路径):realpath()
print -rNC1 -- *(ND-.:P) > listOfFiles.list
答案4
另一种方式tree
,这里没有提到,它是递归的,与 find 或 ls 不同,你没有任何错误(如:Permission denied
,Not 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 上