Как распечатать все не скрытые файлы в директории с помощью lpr

1376
Bentley4

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

3 ответа на вопрос

4
mpy

lpr prints out, what is sent to it via STDIN. So you need to invoke lpr for each file found by find:

find . -type f ! -name ".*" -print0 | xargs -0 lpr 
  • -type f searches for files
  • ! is a logical not, hence ! -name ".*" will omit hidden files (with some help from https://superuser.com/a/101012/195224)
  • -print0 separates the individual filesnames with \0 so that this will also work with file names with white spaces in it.
  • xargs finally executes lpr with the list of filesnames it receives (-0 again tells that \0 is used as a delimiter).

This command will list only non-dotfiles, but also those in dotdirs.

If you also want to exclude dotdirs, extend the find command to

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

And finally, as some versions of lpr have obviously a problem with empty files, omit these also:

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

As a sidenote: To get a nicer layout of your printout (includes file name) you should consider to replace lpr by a2ps.

Команда `найти. Тип F! -имя ". *" -print0 | xargs -0 lpr` завершается неудачно, я получаю `lpr: в запросе на печать нет файла`. И использование этой команды без части `lpr` также перечисляет точечные файлы, так что эта команда кажется неправильной. Bentley4 11 лет назад 0
@ Bentley4: команда, которую я разместил, работает здесь, как и предполагалось, с bash, tcsh и zsh. Что странного в вашем отредактированном вопросе: вы используете `-type d`, но находите файлы списков, а не каталоги. Вы используете GNU Linux? mpy 11 лет назад 1
Я использую Ubuntu. Я получил эту команду из [этой темы] (http://stackoverflow.com/questions/4916588/how-do-i-filter-dotfiles-out-recursively-using-find-in-bash), кстати. По-видимому, это работает и для тех других pple. Bentley4 11 лет назад 0
@ Bentley4: Извините, я не могу воспроизвести это. `-type d` перечисляет только каталоги для меня ... mpy 11 лет назад 1
О, я забыл, что адаптировал эту команду. Иногда я такой тупой, извини! Вам просто нужно заменить d на f, чтобы вы получили следующее: `find. тип F | grep -v '/ \.' `. Bentley4 11 лет назад 0
@ Bentley4: Хорошо, теперь это имеет смысл. Вернуться к моей команде. Вы уверены, что `найти. Тип F! -name ". *" `перечисляет точечные файлы? То, что он делает, это перечисляет не точечные файлы в точечных каталогах. Но, очевидно, вы тоже хотите опустить dotdirs. Это моя ошибка, хотя в вопросе не указано явно, это должно быть ясно из части `grep -v` ... Я отредактирую свой ответ. mpy 11 лет назад 1
Действительно, я имел в виду также опустить точечные каталоги. Извините за то, что не достаточно ясно по этому вопросу. Bentley4 11 лет назад 1
@ Bentley4: Надеюсь, это работает сейчас. mpy 11 лет назад 0
найти. Тип F! -regex ". * / \ .. *"! -name ". *" `перечисляет все не скрытые файлы и каталоги, как вы сказали. Однако `найти. Тип F! -regex ". * / \ .. *"! -имя ". *" -print0 | xargs -0 lpr` по-прежнему не печатает и возвращает `lpr: в запросе на печать нет файла` Bentley4 11 лет назад 0
@ Bentley4: Можете ли вы попробовать, если `lpr` принимает более одного файла? Например, `lpr file1 file2`. Это (http://unix.stackexchange.com/q/73469/33390) намекает на то, что он также может что-то делать с файлами _empty_ ... mpy 11 лет назад 1
Он принимает несколько файлов. Bentley4 11 лет назад 0
@ Bentley4: Хорошо, моя последняя попытка (отредактированный ответ), чтобы пропустить также пустые файлы, так как они, кажется, создают проблемы в некоторых системах. mpy 11 лет назад 0
Хороший улов на пустые файлы! Спасибо. Я посмотрю на `a2ps`, поскольку вывод довольно уродливый. Bentley4 11 лет назад 0
1
manyon

With just the find command, use its -exec option:

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

which passes every matching file name to lpr (the '{}' is expanded to the each file name in turn).

Это возвращает `find: отсутствующий аргумент` -exec'`. Bentley4 11 лет назад 0
`\ n` должен читать` \; ` mpy 11 лет назад 1
1
evilsoup

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 

Похожие вопросы