如何压缩具有特定命名约定的一对文件?

如何压缩具有特定命名约定的一对文件?

我在类似文件夹中有翻译文件

domain-cs_CZ.mo
domain-cs_CZ.po
domain-da_DK.mo
domain-da_DK.po
domain-de_DE.mo
domain-de_DE.po
...

现在我想将所有语言放在一个名为 xx_XX.zip 的 zip 文件中,例如

domain-cs_CZ.mo
domain-cs_CZ.po => cs_CZ.zip

domain-da_DK.mo
domain-da_DK.po => dk_DK.zip

domain-de_DE.mo
domain-de_DE.po => de_DE.zip

只需一个命令,非常简单:

zip xx_XX.zip *-xx_XX.*

但我正在寻找一种自动获取它们的方法。

需要考虑的一些事项:

  • 此文件夹中没有其他文件
  • 有些语言有格式domain-xx
  • 有些语言有格式domain-xx_XX

答案1

类似这样的方法可能会有效:

ls | sed 's/.*/& &/;s/domain-//;s/... /.zip /' | xargs -n2 zip

.zip只需确保目录中没有文件,或者--ignore .zip在之后添加ls以将其从目录列表中删除。

答案2

我希望将所有语言分开放在一个名为 xx_XX.zip 的 zip 文件中,如下所示

domain-cs_CZ.mo
domain-cs_CZ.po => cs_CZ.zip

domain-da_DK.mo
domain-da_DK.po => dk_DK.zip

domain-de_DE.mo
domain-de_DE.po => de_DE.zip

在 Windows 上,使用以下批处理文件 (test.cmd):

@echo off
setlocal
setlocal enabledelayedexpansion
rem get a list of unique filenames
for /f "usebackq" %%f in (`dir /b domain-*.*`) do (
  set _file=%%~nf
  echo !_filelist! | find "!_file!" > nul
  rem if true we have a new name, strip off domain- (1st 7 chars) and save to a file to process later
  if not !errorlevel! == 0 set "_filelist=!_filelist!!_file! " && echo !_file:~7!>>files.txt
  )
rem process the list
for /f %%f in (files.txt) do (
  zip %%f.zip *%%f.*
  )
rem tidy up
del files.txt
endlocal

示例输出:

F:\test>dir domain-*.*
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

15/02/2016  10:48                 0 domain-cs_CZ.mo
15/02/2016  10:49                 0 domain-cs_CZ.po
15/02/2016  10:49                 0 domain-da_DK.mo
15/02/2016  10:49                 0 domain-da_DK.po
15/02/2016  10:49                 0 domain-de_DE.mo
15/02/2016  10:49                 0 domain-de_DE.po
               6 File(s)              0 bytes
               0 Dir(s)  1,774,192,197,632 bytes free

F:\test>test
zip cs_CZ.zip *cs_CZ.*
zip da_DK.zip *da_DK.*
zip de_DE.zip *de_DE.*

进一步阅读

  • Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
  • 启用延迟扩展- 延迟扩展将导致变量在执行时而不是在解析时扩展。
  • 对于/f- 循环命令以执行另一个命令的结果。
  • 参数- 命令行参数(或参数)是传递到批处理脚本的任何值。
  • - 显示、设置或删除 CMD 环境变量。使用 SET 所做的更改将仅在当前 CMD 会话期间保留。
  • 变量- 提取变量的一部分(子字符串)。

相关内容