find . -type f | grep -v '/\.'
递归列出当前目录中所有非隐藏文件。
该命令的示例给出了以下文件树
.
├── css
│ ├── base.css
│ └── main.css
├── img
├── index.html
└── js
└── app.js
$ find . -type f | grep -v '/\.'
./index.html
./css/main.css
./css/base.css
./js/app.js
但是如何使用打印所有这些列出的文件lpr
?
我试过,find . -type f | grep -v '/\.'|lpr
但这只打印此列表,而不是打印每个文件。
答案1
lpr
打印出通过 STDIN 发送给它的内容。因此,您需要lpr
对 find 找到的每个文件调用:
find . -type f ! -name ".*" -print0 | xargs -0 lpr
-type f
搜索文件!
是逻辑上的非,因此! -name ".*"
将忽略隐藏文件(借助https://superuser.com/a/101012/195224)-print0
用 分隔各个文件名,\0
以便这也适用于带有空格的文件名。xargs
最后lpr
使用它收到的文件名列表执行(-0
再次告诉\0
用作分隔符)。
此命令将仅列出非点文件,还有那些在点目录。
如果你也想排除点目录,将find
命令扩展至
find . -type f ! -regex ".*/\..*" ! -name ".*"
最后,正如一些版本的lpr
显然存在空文件问题,也省略这些:
find . -type f ! -regex ".*/\..*" ! -name ".*" ! -empty
附注:为了获得更好的打印输出布局(包括文件名),您应该考虑用lpr
替换a2ps
。
答案2
只需使用find
命令,使用其-exec
选项:
find . -type f ! -name ".*" -exec lpr '{}' \;
将每个匹配的文件名传递给 lpr('{}'
依次扩展为每个文件名)。
答案3
lpr
可以容纳多个文件,因此
lpr ./*
...将打印当前目录中的所有文件。为了实现递归,如果您有 bash 4+,您可以使用
shopt -s globstar
lpr ./**
如果发送目录lpr
导致问题,您可以随时使用带有测试的 for 循环(第二个递归循环需要设置 globstar):
for f in ./*; do [[ -f "$f" ]] && lpr "$f"; done
for f in ./**; do [[ -f "$f" ]] && lpr "$f"; done