Unix“find”命令:显示文件夹/目录类型

Unix“find”命令:显示文件夹/目录类型

如何find .显示条目的类型(目录/文件)?事实上,您无法判断一个条目是文件还是空目录。

答案1

GNU 版本find有一个选项-printf,可以打印各种文件元数据。例如,

find . -printf "%y %p\n"

打印文件类型(f 表示常规文件,d 表示目录)及其名称。

Linux 发行版倾向于部署 GNU 版本的find.如果你没有 GNU find,你可能需要一个小脚本,也许

find . -exec sh -c 'ls -l "$1" | cut -c1' sh-find "{}" \; -print

(对相当难看的输出的改进留给读者作为练习)。

答案2

ls命令有一个标准选项 ,它在目录之后、可执行文件之后、符号链接之后和命名管道之后-F添加一个(并且实现可能会向其中添加更多符号;请参阅手册)。/*@|ls

调用ls -F每个找到的东西:

find . -exec ls -1 -f -d -F {} +

我添加了-1(“dash-one”)选项来获取单列中的结果,-f关闭结果排序(您将获得find查找路径名的顺序),并-d列出目录,而不是其内容。

{} +被成批找到的路径名替换,ls一次可以调用尽可能多的路径名。

运行示例:

$ find . -exec ls -1 -f -d -F {} +
./
./.bash_profile
./.zshrc
./.bashrc
./.yashrc
./dir1/
./dir1/file-1
./dir1/subdir/
./dir1/subdir/file-2
./dir2/
./dir2/file-1
./dir2/subdir/
./dir2/subdir/file-2

不以任何特定字符结尾的路径名是常规文件。

答案3

以下命令类似于find .,但它为目录类型的文件添加尾部斜杠:

find . ! -type d -print -o -exec printf '%s/\n' {} \;

这个想法是指示目录仍然在输出中获得有效的现有路径名。

笔记:

  • 该命令是可移植的。

  • 如果您使用以(并且目录存在).结尾的路径名,那么在处理路径名时,将替换提供的字符串而不是.实际上,您会得到一条以 结尾的行。/find{}//这不是问题,除非您指定根目录/并准确获取//。解决方法是指定/.而不是/.改进是如果已经有尾部斜杠,则不添加斜杠:

    find … \( ! -type d -o -path '*/' \) -print -o -exec printf '%s/\n' {} \;
    

    其中表示一个或多个(或者零,如果你find能接受的话)起始路径名。然后您就可以安全地指定/.

相关内容