移动到存档时压缩文件所需的帮助

移动到存档时压缩文件所需的帮助

我在一个目录 ( ) 中存在一个列表文件和一个源文件/int/source/HR100。所以源目录的内容如下所示。

Customer_Account_20211202.csv
Customer_Account.lst

列表文件 ( Customer_Account.lst) 包含源文件的名称,即Customer_Account_20211202.csv.现在我想压缩源文件并将其移动到目标目录 ( /int/source/HR100/Archive)。我能够使用单行 Unix 命令来实现移动,如下所示,但我不知道如何压缩移动文件。我更喜欢 Gzip ( .gz) 格式。

我正在使用的代码:

xargs -a Customer_Account.lst mv -t /int/source/HR100/Archive

上面的一行代码在不压缩的情况下移动了代码。我想要一个能够从列表中读取文件、压缩然后移动的单行代码。

答案1

你可以尝试这样的事情:

a=$(cat Customer_Account.lst).gz; xargs -a Customer_Account.lst gzip -c >/int/source/HR100/Archive/$a

答案2

如果您只有一个数据文件(您称之为“源文件”),那么您不需要xargs。  罗密欧·尼诺夫的回答,仅简化为一个数据文件并修改为实际执行移动 ( mv),变为

a=$(< Customer_Account.lst)  &&  gzip "$a"  &&  mv "$a.gz" /int/source/HR100/Archive

wherea=$(< Customer_Account.lst)只是 bash 的一种做法a=$(cat Customer_Account.lst)。因此,这将从 读取文件名Customer_Account.lst,压缩文件,并将压缩文件移动到 Archive 目录。我们用来&&确保仅当前面的步骤成功时才执行后面的步骤,并且我们引用我们的变量,因为您应该始终这样做。

但是你调用了Customer_Account.lst一个“列表文件”,并且你似乎想使用xargs.这些事实表明,有一天您可能会在Customer_Account.lst.因此,请考虑对您的命令进行以下调整:

xargs -a Customer_Account.lst sh -c 'for f; do gzip "$f"  &&  mv "$f.gz" /int/source/HR100/Archive; done' sh

你的命令用来xargs运行的地方mv,这个命令用来xargs运行sh(shell)。 shell 通过一行脚本调用,该脚本循环遍历参数,并压缩和移动每个参数。

如果您有六到八个文件,这很好。但它为每个文件调用一次,并且为每个文件gzip调用一次。mv这是一种浪费,如果您有数百个文件,可能会导致命令花费很长时间。在这种情况下,请考虑

xargs -a Customer_Account.lst bash -c 'gzip "$@"  &&  mv "${@/%/.gz}" /int/source/HR100/Archive' sh

这也会使用列表文件中的文件名列表运行 shell(具体来说,bash),但它不会执行显式循环。相反,它将列表 ( "$@") 传递给gzip,然后将列表的修改版本传递给 mv。修改是由 完成的"${@/%/.gz}"。  /%/.gz就像s/$/.gz/sed;它添加.gz到最后。并"${@…}"导致对参数列表中的每个单词进行替换。 (此功能存在于 bash 中,但并非所有其他符合 POSIX 的 shell 中都有。)

相关内容