我有一个包含文件和目录的完整路径名的文件。
我想从这个列表中过滤掉任何引用目录的路径名,以便留下一个仅包含文件路径的列表。
有人能想到一个优雅的解决方案吗?
答案1
while IFS= read -r file; do
[ -d "$file" ] || printf '%s\n' "$file"
done <input_file
将打印未确定类型的文件目录(或目录的符号链接)。它将保留所有其他类型的文件(常规文件、符号链接(目录除外)、套接字、管道...)以及无法确定类型的文件(例如,因为它们不存在或位于您不存在的目录中)没有搜索权限)。
一些变化取决于你的意思按文件和目录(目录是 Unix 上多种类型的文件之一):
文件存在(符号链接解析后)并且不是类型目录:
[ -e "$file" ] && [ ! -d "$file" ] && printf '%s\n' "$file"
文件存在并且是一个常规的文件(符号链接解析后):
[ -f "$file" ] && printf '%s\n' "$file"
文件存在并且是一个常规的符号链接解析之前的文件(不包括符号链接):
[ -f "$file" ] && [ ! -L "$file" ] && printf '%s\n' "$file"
ETC。
答案2
假设file
每行包含一个文件路径,其中zsh
:
printf '%s\n' ${(f)^"$(<file)"}(N^/)
将打印那些确实存在(我们可以知道存在)并且不确定属于哪种类型的目录(更改/
为-/
也丢弃目录的符号链接)。
既然你提到了xargs
,使用 GNU 实现( for-d
和-r
),并假设没有任何文件路径以-
或find
谓词开头(如!
),你可以这样做:
xargs -rd '\n' sh -xc 'exec find "$@" -prune ! -type d' sh < file
替换-type
为-xtype
(假设 GNU find
)也可以排除目录的符号链接。