17

我需要一个基本上可以做到这一点的shell脚本:

  • 在文件夹中搜索所有 txt 文件,并为找到的每个文件创建一个单独的 zip 文件,该文件与找到的 txt 文件相同 + .zip。
  • 之后将创建的 zip 文件移动到 txt 文件。

基本上,它是一个脚本,用于将 txt 文件列表替换为其 zip 等效文件但保持相同的名称。

我已经使用 find 来查找要压缩的文件:

find . -name '.txt.' -print

结果是:

./InstructionManager.txt.0
./InstructionManager.txt.1

这些是我想单独压缩的文件(当然它们会更多),但不知道如何将它们单独用作 make 命令的参数,例如:

zip ./InstructionManager.txt.0.zip ./InstructionManager.txt.0
mv ./InstructionManager.txt.0.zip ./InstructionManager.txt.0
zip ./InstructionManager.txt.1.zip ./InstructionManager.txt.1
mv ./InstructionManager.txt.1.zip ./InstructionManager.txt.1

有任何想法吗?不,我不想要包含所有文件的 zip:S 谢谢

4

4 回答 4

29
find . -name '*.txt.*' -print -exec zip '{}'.zip '{}' \; -exec mv '{}'.zip '{}' \;
  • 查找.txt文件
  • 第一个-exec压缩文件
  • 第二个-exec将压缩文件重命名为原始名称

请注意,此过程会覆盖原始文件。为确保新文件是实际的 zip 文件,您可以执行以下操作:

file InstructionManager.txt.*

哪个应该返回:

InstructionManager.txt.0: Zip archive data, at least v1.0 to extract
InstructionManager.txt.1: Zip archive data, at least v1.0 to extract
于 2012-09-07T16:47:32.800 回答
12

使用查找和压缩:

find . -name '*.txt.*' -exec zip '{}.zip' '{}' \;
于 2012-09-07T16:45:55.493 回答
1

使用findand xargs, 接受带空格的文件名:

find . -name '*.txt.*' -print0 | xargs -0 -r -n1 -I % sh -c '{ zip %.zip %; mv %.zip %;}'

文件被压缩,然后重命名为其原始名称

于 2012-09-07T17:12:24.893 回答
0

如果要在单独压缩所有内容后删除原始文件,则可以使用以下命令。

$ find . -name '*.txt.*' -print -exec zip '{}'.zip '{}' \; -exec rm '{}' \;
于 2021-09-10T15:34:24.963 回答