【Linux命令大全】002.文件传输之lpr命令(实操篇)
✨ 本文为Linux系统文件传输命令的全面汇总与深度优化,结合图标、结构化排版与实用技巧,专为高级用户和系统管理员打造。
(关注不迷路哈!!!)
文章目录
- 【Linux命令大全】002.文件传输之lpr命令(实操篇)
-
- 一、功能与作用
- 二、基本用法
-
- [1. 打印单个文件](#1. 打印单个文件)
- [2. 指定打印机](#2. 指定打印机)
- [3. 指定打印份数](#3. 指定打印份数)
- [4. 从标准输入打印](#4. 从标准输入打印)
- [5. 设置打印作业名称](#5. 设置打印作业名称)
- 三、高级用法
-
- [1. 打印完成后删除原文件](#1. 打印完成后删除原文件)
- [2. 打印完成后发送邮件通知](#2. 打印完成后发送邮件通知)
- [3. 按原样打印文件](#3. 按原样打印文件)
- [4. 设置打印机特定选项](#4. 设置打印机特定选项)
- [5. 组合使用多个参数](#5. 组合使用多个参数)
- [6. 打印多个文件](#6. 打印多个文件)
- [7. 打印时不打印标题页](#7. 打印时不打印标题页)
- 四、实际应用场景
-
- [1. 批量打印脚本](#1. 批量打印脚本)
- [2. 打印服务器客户端配置](#2. 打印服务器客户端配置)
- [3. 定时打印任务](#3. 定时打印任务)
- [4. 打印质量控制](#4. 打印质量控制)
- 五、注意事项与最佳实践
-
- [1. 命令可用性](#1. 命令可用性)
- [2. 与CUPS的兼容性](#2. 与CUPS的兼容性)
- [3. 打印机配置检查](#3. 打印机配置检查)
- [4. 打印队列监控](#4. 打印队列监控)
- [5. 打印作业管理](#5. 打印作业管理)
- [6. 大文件处理](#6. 大文件处理)
- 六、常见错误与解决方案
-
- [1. 命令未找到](#1. 命令未找到)
- [2. 打印机不可用](#2. 打印机不可用)
- [3. 权限被拒绝](#3. 权限被拒绝)
- [4. 打印作业卡住](#4. 打印作业卡住)
- [5. 格式错误](#5. 格式错误)
- 七、总结
一、功能与作用
lpr命令是行式打印机请求工具(Line Printer Request) ,用于将文件发送到Linux系统中的打印队列进行打印。它是传统Unix打印系统(LPR/LPD)的核心组件之一,负责接收用户的打印请求并将文件传输到指定的打印机队列中。lpr命令支持多种文件格式,能够处理文本文件、PostScript文件、PDF文件等多种类型的文档,是Linux系统中最常用的打印命令之一。
参数详解
| 参数 | 说明 |
|---|---|
-P printer |
指定打印机名称 |
-# number |
指定打印份数,number为正整数 |
-C name |
设置打印任务名称 |
-J name |
设置作业名称 |
-T title |
设置文档标题 |
-l |
按原样打印文件,不进行过滤处理 |
-r |
打印完成后删除原文件 |
-m |
打印完成后发送邮件通知 |
-h |
打印时不打印标题页 |
-o option |
设置打印机特定选项,如双面打印等 |
-E |
加密连接到打印服务器(在CUPS中使用) |
二、基本用法
1. 打印单个文件
最基本的lpr命令用法是直接指定要打印的文件名:
bash
# 打印单个文件
lpr document.txt
这个命令会将document.txt文件发送到默认打印机的队列中等待打印。
2. 指定打印机
使用-P参数可以指定要使用的打印机:
bash
# 指定打印机打印文件
lpr -P laserjet report.pdf
3. 指定打印份数
使用-#参数可以指定打印的份数:
bash
# 打印3份文件
lpr -# 3 presentation.pptx
4. 从标准输入打印
lpr命令还支持从标准输入接收内容进行打印:
bash
# 从标准输入打印
cat notes.txt | lpr
# 打印命令输出
ls -la | lpr
5. 设置打印作业名称
使用-J参数可以设置打印作业的名称,便于在打印队列中识别:
bash
# 设置打印作业名称
lpr -J "Weekly Report" report.docx
三、高级用法
1. 打印完成后删除原文件
使用-r参数可以在打印完成后自动删除原文件,适用于临时文件或不需要保留的文档:
bash
# 打印完成后删除原文件
lpr -r temporary_report.txt
2. 打印完成后发送邮件通知
使用-m参数可以在打印完成后发送邮件通知:
bash
# 打印完成后发送邮件通知
lpr -m important_document.pdf
3. 按原样打印文件
使用-l参数可以指示打印机按文件的原样进行打印,不进行任何过滤或格式化处理,适用于已经预先格式化的文档:
bash
# 按原样打印文件
lpr -l preformatted.ps
4. 设置打印机特定选项
使用-o参数可以设置打印机特定的选项,如双面打印、页面大小等。具体可用的选项取决于打印机型号和驱动程序:
bash
# 设置双面打印
lpr -o sides=two-sided-long-edge document.pdf
# 设置页面大小为A4
lpr -o media=A4 report.docx
# 设置打印质量
lpr -o print-quality=best photo.jpg
5. 组合使用多个参数
可以根据需要组合使用多个参数,实现更复杂的打印需求:
bash
# 打印2份文档,使用双面打印,发送到指定打印机,设置作业名称
lpr -P colorjet -# 2 -o sides=two-sided-long-edge -J "Quarterly Budget" budget.pdf
6. 打印多个文件
可以一次指定多个文件进行打印:
bash
# 打印多个文件
lpr file1.txt file2.txt file3.txt
7. 打印时不打印标题页
使用-h参数可以在打印时不打印标题页,适用于不需要包含作业信息的场景:
bash
# 不打印标题页
lpr -h document.txt
四、实际应用场景
1. 批量打印脚本
可以编写一个简单的脚本来批量打印多个文件:
bash
#!/bin/bash
# 批量打印脚本
# 检查参数
if [ $# -lt 1 ]; then
echo "Usage: $0 <file1> [file2] [file3] ..."
exit 1
fi
# 打印所有指定的文件
for file in "$@"; do
if [ -f "$file" ]; then
echo "Printing $file..."
lpr "$file"
if [ $? -eq 0 ]; then
echo " Done."
else
echo " Failed to print $file."
fi
else
echo "Warning: $file is not a valid file. Skipping."
fi
done
# 显示打印队列状态
echo "\nCurrent print queue status:"
lpd
使用示例:
bash
# 授予执行权限
chmod +x batch_print.sh
# 批量打印文件
./batch_print.sh report1.pdf report2.pdf presentation.pptx
2. 打印服务器客户端配置
可以编写一个脚本,帮助用户快速配置打印客户端并连接到指定的打印服务器:
bash
#!/bin/bash
# 配置LPR打印客户端
# 检查参数
if [ $# -ne 3 ]; then
echo "Usage: $0 <printer_name> <server_address> <queue_name>"
echo "Example: $0 laserjet printserver.example.com lp"
exit 1
fi
PRINTER_NAME=$1
SERVER_ADDRESS=$2
QUEUE_NAME=$3
# 检查是否已安装lpr包
if ! command -v lpr &> /dev/null; then
echo "Installing lpr package..."
if [ -f /etc/debian_version ]; then
sudo apt-get update
sudo apt-get install -y lpr
elif [ -f /etc/redhat-release ]; then
sudo yum install -y lpr
fi
fi
# 配置打印队列
CONFIG_FILE="/etc/printcap"
BACKUP_FILE="/etc/printcap.bak"
# 备份现有配置
if [ -f "$CONFIG_FILE" ]; then
sudo cp "$CONFIG_FILE" "$BACKUP_FILE"
echo "Backed up current printcap to $BACKUP_FILE"
fi
# 添加新的打印机配置
echo "Adding printer configuration to $CONFIG_FILE..."
sudo tee -a "$CONFIG_FILE" > /dev/null << EOL
$PRINTER_NAME|Network Printer $PRINTER_NAME:
:rm=$SERVER_ADDRESS:
:rp=$QUEUE_NAME:
:sd=/var/spool/lpd/$PRINTER_NAME:
:lf=/var/log/lpd-errs:
:mx#0:
:sh:
EOL
# 创建spool目录
echo "Creating spool directory..."
sudo mkdir -p /var/spool/lpd/$PRINTER_NAME
sudo chown daemon:daemon /var/spool/lpd/$PRINTER_NAME
sudo chmod 775 /var/spool/lpd/$PRINTER_NAME
# 重启lpd服务
echo "Restarting lpd service..."
sudo killall lpd 2>/dev/null
sudo lpd
# 测试打印
echo "Testing printer configuration..."
echo "This is a test page from $HOSTNAME" | lpr -P $PRINTER_NAME
if [ $? -eq 0 ]; then
echo "\nPrinter configuration completed successfully!"
echo "You can now print to $PRINTER_NAME using: lpr -P $PRINTER_NAME <file>"
else
echo "\nFailed to send test print job. Please check your configuration."
fi
3. 定时打印任务
可以使用cron和lpr命令设置定时打印任务,例如每天自动打印报表:
bash
#!/bin/bash
# 每日报表打印脚本
REPORT_FILE="/path/to/daily_report.pdf"
PRINTER_NAME="laserjet"
LOG_FILE="/var/log/daily_print.log"
# 检查报表文件是否存在
if [ ! -f "$REPORT_FILE" ]; then
echo "[$(date)] Error: Report file $REPORT_FILE not found." >> $LOG_FILE
exit 1
fi
# 发送打印请求
lpr -P $PRINTER_NAME -J "Daily Report $(date +%Y-%m-%d)" $REPORT_FILE
if [ $? -eq 0 ]; then
echo "[$(date)] Successfully printed daily report." >> $LOG_FILE
else
echo "[$(date)] Failed to print daily report." >> $LOG_FILE
# 可以选择发送通知邮件
echo "Daily report printing failed on $(hostname)" | mail -s "Print Job Failure" admin@example.com
fi
然后通过cron设置定时任务:
bash
# 编辑crontab配置
crontab -e
# 添加以下行,每天早上9点执行打印任务
0 9 * * * /path/to/daily_report_print.sh
4. 打印质量控制
可以编写一个脚本,根据文档类型自动设置合适的打印选项:
bash
#!/bin/bash
# 智能打印脚本 - 根据文件类型自动设置打印选项
# 检查参数
if [ $# -lt 1 ]; then
echo "Usage: $0 <file> [printer]"
exit 1
fi
FILE=$1
PRINTER=${2:-default}
# 获取文件类型
FILE_TYPE=$(file -b "$FILE")
# 根据文件类型设置打印选项
case "$FILE_TYPE" in
*PDF*) # PDF文件
OPTIONS="-o fit-to-page"
echo "Printing PDF file with fit-to-page option"
;;
*PostScript*) # PostScript文件
OPTIONS="-l"
echo "Printing PostScript file as raw data"
;;
*image*) # 图像文件
OPTIONS="-o print-quality=best"
echo "Printing image file with best quality"
;;
*text*) # 文本文件
OPTIONS="-o page-left=36 -o page-right=36 -o page-top=36 -o page-bottom=36"
echo "Printing text file with margins"
;;
*) # 其他文件类型
OPTIONS=""
echo "Printing unknown file type with default options"
;;
esac
# 执行打印命令
if [ "$PRINTER" = "default" ]; then
lpr $OPTIONS "$FILE"
else
lpr -P $PRINTER $OPTIONS "$FILE"
fi
# 检查打印是否成功
if [ $? -eq 0 ]; then
echo "Print job submitted successfully"
else
echo "Failed to submit print job"
exit 1
fi
五、注意事项与最佳实践
1. 命令可用性
lpr命令在大多数Linux发行版中默认安装,但可能需要安装额外的软件包才能使用全部功能。如果系统上未找到该命令,请安装相应的软件包:
bash
# 在Debian/Ubuntu系统上安装
sudo apt-get update
sudo apt-get install -y lpr
# 在CentOS/RHEL系统上安装
sudo yum install -y lpr
2. 与CUPS的兼容性
现代Linux系统通常使用CUPS作为默认打印系统。CUPS提供了与传统LPR/LPD命令兼容的接口,但某些参数和行为可能有所不同。如果在使用lpr命令时遇到问题,可以尝试使用CUPS的原生命令lp:
bash
# CUPS等效命令
lp document.txt # 打印文件
lp -d printer_name document.txt # 指定打印机打印
lp -n 3 document.txt # 打印3份
3. 打印机配置检查
在使用lpr命令前,建议先检查系统上配置的打印机列表,确认要使用的打印机名称正确:
bash
# 查看可用的打印机(LPR/LPD系统)
lpq -a
# 查看可用的打印机(CUPS系统)
lpstat -p -d
4. 打印队列监控
提交打印作业后,可以使用lpq命令监控打印队列状态,确认作业是否成功提交并了解打印进度:
bash
# 查看打印队列状态
lpq
# 查看特定打印机的队列状态
lpq -P printer_name
5. 打印作业管理
如果需要取消已提交的打印作业,可以使用lprm命令:
bash
# 取消当前用户的所有打印作业
lprm -
# 取消特定的打印作业
lprm job_id
# 取消特定打印机上的特定作业
sudo lprm -P printer_name job_id
6. 大文件处理
对于大型文档,建议在打印前进行适当的压缩或分割,以提高打印效率并减少系统资源占用:
bash
# 压缩PDF文件后打印
pdfcompress large_document.pdf compressed.pdf
lpr compressed.pdf
# 分割大文件后逐部分打印
split -l 1000 large_file.txt part_
lpr part_* # 打印所有部分
六、常见错误与解决方案
1. 命令未找到
问题现象 :执行lpr命令时显示"command not found"错误。
解决方案:
- 确认是否安装了
lpr软件包 - 检查命令是否在系统PATH中
bash
# 查找lpr命令位置
which lpr
# 或
find / -name lpr 2>/dev/null
# 安装lpr包(如果尚未安装)
sudo apt-get install lpr # Debian/Ubuntu
sudo yum install lpr # CentOS/RHEL
2. 打印机不可用
问题现象 :执行lpr命令时显示"printer not available"或类似错误。
解决方案:
- 确认打印机名称是否正确
- 检查打印机是否已连接并处于就绪状态
- 验证打印服务是否正在运行
bash
# 查看可用的打印机
lpq -a
# 检查打印服务状态
systemctl status lpd # 对于LPR/LPD系统
systemctl status cups # 对于CUPS系统
3. 权限被拒绝
问题现象 :执行lpr命令时显示"permission denied"错误。
解决方案:
- 确认当前用户有足够的权限使用打印机
- 检查打印队列的权限设置
- 验证文件权限是否允许读取要打印的文件
bash
# 检查文件权限
ls -l document.txt
# 检查打印队列权限
ls -la /var/spool/lpd/
# 使用sudo尝试打印
sudo lpr document.txt
4. 打印作业卡住
问题现象:打印作业已提交到队列,但长时间未完成打印。
解决方案:
- 检查打印机是否有卡纸、缺纸等问题
- 查看打印队列状态,确认作业是否在队列中
- 尝试取消卡住的作业并重新提交
bash
# 查看打印队列状态
lpq
# 取消卡住的作业
lprm job_id
# 重启打印服务
sudo systemctl restart lpd # 对于LPR/LPD系统
sudo systemctl restart cups # 对于CUPS系统
5. 格式错误
问题现象:打印出的文档格式不正确或乱码。
解决方案:
- 确认文件格式与打印机兼容
- 尝试使用
-l参数按原样打印 - 对于文本文件,可以尝试使用
a2ps等工具进行格式化后再打印
bash
# 按原样打印文件
lpr -l document.txt
# 使用a2ps格式化文本文件后打印
a2ps document.txt | lpr
七、总结
lpr命令是Linux系统中用于提交打印作业的重要工具,通过它可以方便地将各种类型的文件发送到打印机进行打印。无论是普通用户还是系统管理员,掌握lpr命令的使用都能帮助提高打印资源的利用效率和管理水平。
在实际应用中,可以结合其他打印命令如lpq和lprm,以及编写简单的自动化脚本,实现更高效的打印工作流。同时,需要注意与现代CUPS打印系统的兼容性问题,以及在网络环境中的使用限制。通过合理配置和使用lpr命令,可以确保打印任务的顺利完成和打印资源的有效管理。