So drucken Sie alle nicht versteckten Dateien rekursiv in einem Verzeichnis mithilfe von lpr

1655
Bentley4

find . -type f | grep -v '/\.' listet alle nicht versteckten Dateien im aktuellen Verzeichnis rekursiv auf.

Ein Beispiel für diesen Befehl gibt die folgende Dateibaumstruktur an

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

Aber wie drucke ich alle diese aufgelisteten Dateien lpr?
Ich habe es versucht, find . -type f | grep -v '/\.'|lpraber dies druckt nur diese Liste, anstatt jede Datei zu drucken.

1

3 Antworten auf die Frage

4
mpy

lprdruckt aus, was per STDIN an ihn gesendet wird. Sie müssen also lprjede gefundene Datei mit find aufrufen :

find . -type f ! -name ".*" -print0 | xargs -0 lpr 
  • -type f sucht nach Dateien
  • !ist eine logische nicht, daher ! -name ".*"werden versteckte Dateien ausgelassen (mit Hilfe von https://superuser.com/a/101012/195224 )
  • -print0trennt die einzelnen Dateinamen mit, \0so dass dies auch mit Dateinamen mit Leerzeichen funktioniert.
  • xargsführt sie schließlich lprmit der Liste der Dateinamen aus, die sie empfängt ( -0teilt wiederum mit, dass \0sie als Trennzeichen verwendet wird).

Dieser Befehl listet nur Nicht-Punkt- Dateien auf, aber auch solche in Punkt- Verzeichnissen .

Wenn Sie auch dotdirs ausschließen möchten, erweitern Sie den findBefehl auf

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

Und schließlich, da einige Versionen lpr offensichtlich ein Problem mit leeren Dateien haben, lassen Sie diese auch aus:

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

Als Nebenbemerkung: Um ein besseres Layout Ihres Ausdrucks (einschließlich Dateinamen) zu erhalten, sollten Sie in Betracht ziehen, lprdurch zu ersetzen a2ps.

The command `find . -type f ! -name ".*" -print0 | xargs -0 lpr` fails, I get `lpr: No file in print request.`. And using this command without the `lpr` part lists out dotfiles as well so it doesn't seem to be the right command. Bentley4 vor 11 Jahren 0
@ Bentley4: Der Befehl, den ich gepostet habe, funktioniert hier wie vorgesehen mit bash, tcsh und zsh. Was ist seltsam an Ihrer bearbeiteten Frage: Sie verwenden `-type d`, finden aber Listen-Dateien und keine Verzeichnisse. Verwenden Sie GNU Linux? mpy vor 11 Jahren 1
Ich benutze Ubuntu. Ich habe diesen Befehl von [diesem Thread] (http://stackoverflow.com/questions/4916588/how-do-i-filter-dotfiles-out-recursively-using-find-in-bash) erhalten. Anscheinend funktioniert es auch für die anderen Leute. Bentley4 vor 11 Jahren 0
@ Bentley4: Sorry, ich kann das nicht reproduzieren. `-type d` listet nur Verzeichnisse für mich auf ... mpy vor 11 Jahren 1
Oh, ich habe vergessen, diesen Befehl angepasst zu haben. Ich bin manchmal so ein Dummkopf, sorry! Sie müssen nur d durch f ersetzen, damit Sie Folgendes erhalten: `find. -type f | grep -v '/ \.' `. Bentley4 vor 11 Jahren 0
@ Bentley4: Ok, das macht jetzt Sinn. Zurück zu meinem Befehl. Bist du sicher? -type f! -name ". *" `listet dotfiles auf? Was es tut, ist das Auflisten von Nicht-Punktdateien in Punktverzeichnissen. Aber natürlich möchten Sie auch dotdirs weglassen. Das ist meine Schuld, obwohl es in der Frage nicht ausdrücklich angegeben ist, dass es aus dem `grep -v'-Teil klar sein sollte ... Ich werde meine Antwort bearbeiten. mpy vor 11 Jahren 1
Tatsächlich wollte ich auch Punktverzeichnisse weglassen. Tut mir leid, dass ich nicht klar genug bin. Bentley4 vor 11 Jahren 1
@ Bentley4: Hoffe, es funktioniert jetzt. mpy vor 11 Jahren 0
`finden. -type f! -regex ". * / \ .. *"! -name ". *" `listet alle nicht versteckten Dateien und Verzeichnisse auf, so wie Sie es sagten. Jedoch `finden. -type f! -regex ". * / \ .. *"! -name ". *" -print0 | xargs -0 lpr` wird immer noch nicht gedruckt und gibt 'lpr: Keine Datei in der Druckanforderung' zurück Bentley4 vor 11 Jahren 0
@ Bentley4: Kannst du es bitte versuchen, wenn `lpr` mehr als eine Datei akzeptiert? ZB `lpr file1 file2`. Dieses (http://unix.stackexchange.com/q/73469/33390) weist darauf hin, dass es auch etwas mit _empty_-Dateien zu tun haben kann ... mpy vor 11 Jahren 1
Es akzeptiert mehrere Dateien. Bentley4 vor 11 Jahren 0
@ Bentley4: Ok, mein letzter Versuch (bearbeitete Antwort), auch leere Dateien wegzulassen, da sie auf manchen Systemen Probleme bereiten. mpy vor 11 Jahren 0
Netter Fang für die leeren Dateien! Vielen Dank. Ich werde einen Blick auf "a2ps" werfen, da die Ausgabe ziemlich hässlich ist. Bentley4 vor 11 Jahren 0
1
manyon

findVerwenden Sie einfach nur den Befehl -exec:

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

die jeden übereinstimmenden Dateinamen an lpr übergibt (der '{}'wird zu jedem Dateinamen der Reihe nach erweitert).

Dies gibt `find: missing argument an -exec 'zurück. Bentley4 vor 11 Jahren 0
`\ n` sollte` \; `lauten mpy vor 11 Jahren 1
1
evilsoup

lpr kann mehrere Dateien aufnehmen, also

lpr ./* 

... druckt alle Dateien im aktuellen Verzeichnis. Für Rekursivität können Sie, wenn Sie bash 4+ haben, verwenden

shopt -s globstar lpr ./** 

Wenn das Senden von Verzeichnissen zu lprProblemen führt, können Sie immer eine for-Schleife mit einem Test verwenden (die zweite, rekursive, erfordert die Einstellung von globstar):

for f in ./*; do [[ -f "$f" ]] && lpr "$f"; done for f in ./**; do [[ -f "$f" ]] && lpr "$f"; done