从文件和目录列表中过滤目录

从文件和目录列表中过滤目录

我有一个包含文件和目录的完整路径名的文件。

我想从这个列表中过滤掉任何引用目录的路径名,以便留下一个仅包含文件路径的列表。

有人能想到一个优雅的解决方案吗?

答案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)也可以排除目录的符号链接。

相关内容