如何将 unzip -v 输出重定向到 shell 脚本中的日志文件

如何将 unzip -v 输出重定向到 shell 脚本中的日志文件

我有一个脚本,可以循环遍历一个大目录中的所有 zip 文件并单独解压缩它们。我使用 -q 选项是为了保持控制台干净并显示其他监控信息。

我想保持相同的行为,但想将 -v 选项的输出添加到整个操作的单个日志文件中。实现这一目标的最佳方法是什么?顺便说一句,我对脚本编写还是有点陌生​​,所以任何输入都会受到赞赏。

解压脚本部分:

for FILES in $(ls -1Sr|grep a_media*)
 do unzip -q $FILES -d $DESTINATION
done

答案1

您可以重定向stdoutandstderr整个循环:

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

相关内容