我在一个目录 ( ) 中存在一个列表文件和一个源文件/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 中都有。)