Como imprimir todos os arquivos não ocultos recursivamente em um diretório usando lpr

1

find . -type f | grep -v '/\.' lista todos os arquivos não ocultos no diretório atual recursivamente.

Exemplo deste comando dada a seguinte árvore de arquivos

.
├── 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

Mas como imprimo todos esses arquivos listados usando lpr ?
Eu tentei find . -type f | grep -v '/\.'|lpr , mas isso só imprime esta lista em vez de imprimir cada arquivo.

    
por Bentley4 29.05.2013 / 14:10

3 respostas

4

lpr imprime, o que é enviado para ele via STDIN. Então você precisa invocar lpr para cada arquivo encontrado por find:

find . -type f ! -name ".*" -print0 | xargs -0 lpr
  • -type f procura arquivos
  • ! não é lógico, portanto, ! -name ".*" omitirá arquivos ocultos (com alguma ajuda do link )
  • -print0 separa os nomes de arquivos individuais com xargs , de modo que isso também funcionará com nomes de arquivos com espaços em branco.
  • lpr finalmente executa -0 com a lista de nomes de arquivos que recebe ( find informa novamente que lpr é usado como um delimitador).

Este comando irá listar apenas arquivos não-ponto, , mas também aqueles em dirs .

Se você também quiser excluir dotdirs , estenda o comando lpr para

find . -type f ! -regex ".*/\..*" ! -name ".*"

E, finalmente, como algumas versões do a2ps têm obviamente um problema com arquivos vazios , omita essas também :

find . -type f ! -regex ".*/\..*" ! -name ".*" ! -empty

Como um sidenote: Para obter um layout melhor de sua impressão (inclui o nome do arquivo), você deve considerar substituir %code% by %code% .

    
por 29.05.2013 / 14:31
1

Com apenas o comando find , use sua opção -exec :

find . -type f ! -name ".*" -exec lpr '{}' \;

que transmite todos os nomes de arquivos correspondentes para lpr (o '{}' é expandido para o nome de cada arquivo).

    
por 29.05.2013 / 15:35
1

lpr pode receber vários arquivos, então

lpr ./*

... imprime todos os arquivos no diretório atual. Para recursividade, se você tiver bash 4+, você pode usar

shopt -s globstar
lpr ./**

Se o envio de diretórios para lpr causar problemas, você sempre poderá usar um loop for com um teste (o segundo, recursivo, requer que o globstar seja definido):

for f in ./*; do [[ -f "$f" ]] && lpr "$f"; done
for f in ./**; do [[ -f "$f" ]] && lpr "$f"; done
    
por 30.05.2013 / 16:49