我有一个脚本,可以循环遍历一个大目录中的所有 zip 文件并单独解压缩它们。我使用 -q 选项是为了保持控制台干净并显示其他监控信息。
我想保持相同的行为,但想将 -v 选项的输出添加到整个操作的单个日志文件中。实现这一目标的最佳方法是什么?顺便说一句,我对脚本编写还是有点陌生,所以任何输入都会受到赞赏。
解压脚本部分:
for FILES in $(ls -1Sr|grep a_media*)
do unzip -q $FILES -d $DESTINATION
done
答案1
您可以重定向stdout
andstderr
整个循环:
for FILES in $(ls -1Sr|grep a_media*)
do unzip -q "$FILES" -d "$DESTINATION"
done > log 2>&1
至少使用zsh
最新版本,bash
您可以替换> log 2>&1
为>& log
.
您的ls
处理可疑,请参阅为什么*不*解析`ls`?...
答案2
首先,我建议您将命令中的$FILES
和$DESTINATION
变量unzip
用双引号括起来,因为如果路径包含空格,它们会破坏命令unzip
;另请注意,由于ls
将包含换行符的“原始”文件名输出到管道,您的脚本将在包含换行符的文件名上中断;使用bash
的 globbing 功能来代替 ( for FILES in /path/to/archives/* [...]
)。
其次,当您不unzip
使用该-q
选项运行时,该选项会抑制正常输出,其写入的输出stdout
(STDandard OUTput)通常是链接到终端屏幕的文件; shellbash
可以将命令的输出重定向stdout
到另一个文件:例如,在 中,这可以通过和运算符bash
来完成,分别是 1. 创建文件(如果不存在)或截断它,然后将输出附加到该文件和 2 . 创建文件(如果不存在)或将输出附加到该文件。>
>>
因此,在这种情况下,由于您正在处理多个存档,因此您不希望每次处理新文件时都截断日志文件,而是希望将新输出附加到已经存在的日志中;包括我的更正:
for FILES in /path/to/archives/*
do
unzip -v "$FILES" -d "$DESTINATION" >> /path/to/logfile
done