如何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
能接受的话)起始路径名。然后您就可以安全地指定/
.