1

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 но это печатает только этот список вместо печати каждого файла.

3 ответа3

4

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 используется в качестве разделителя).

Эта команда выведет список не только точечных файлов, но и файлов с точечными каталогами.

Если вы также хотите исключить dotdirs, расширьте команду find до

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

И, наконец, поскольку у некоторых версий lpr , очевидно, есть проблема с пустыми файлами, пропустите их также:

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

Как примечание: чтобы получить более качественный макет вашей распечатки (включая имя файла), вы должны заменить lpr на a2ps .

1

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
1

Просто с помощью команды find используйте параметр -exec :

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

который передает каждое соответствующее имя файла в lpr ('{}' расширяется до каждого имени файла по очереди).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .