如何使用 lpr 递归打印目录中的所有非隐藏文件

如何使用 lpr 递归打印目录中的所有非隐藏文件

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

相关内容