根据 zip 名称模式将 zip 文件提取到目录中

根据 zip 名称模式将 zip 文件提取到目录中

我有这些 zip 文件:

PLP_633555_2015-03-04_01-12-01.zip
PLP_634562_2004-03-02_02-15-07_UBIC.zip
PLP_563462_2008-05-02_01-21-03_UBIC_STOC.zip

我需要使用这种格式将每个 zip 提取到适当的目录中(基本上,我只需要前 30 个字符):

PLP_633555_2015-03-04_01-12-01
PLP_634562_2004-03-02_02-15-07
PLP_563462_2008-05-02_01-21-03

这是我当前拥有的命令,该命令有效,但仅适用于第二个 zip 文件 (PLP_634562_2004-03-02_02-15-07_UBIC.zip)

for f in /PLP*.zip; do n=$(echo $f | cut -f 1-5 -d '_'); unzip -d $n $f;done

我想更改它,以便它只读取 zip 文件的前 30 个字符,然后基于该字符创建目录。它将确保任何新的 zip 文件命名格式将来都可以使用。

我尝试将命令的 n 变量部分更改为此

n=$(echo ${f:0:30}); 

但这没有用。我正在使用 Linux bash。

答案1

sed可以获得前 30 个字符:

sed 's|\(.\{30\}\).*|\1|'

并使用它而不是cutfor循环中。

该替换的细分是您替换为sed之间的匹配内容。 (用 转义)计数 30 个单个字符 ( )。\( \)\1{30}\.

答案2

感谢您的所有建议,我吸收了大家的建议并构建了这个命令。就我而言,这正是我需要的命令。

for f in /mydirectory/*.zip; do
   n=$(echo ${f##*/} | cut -c1-30);
   unzip -d /mydirectory/$n $f;
done
  • 它循环遍历所有 zip 文件
  • 回显每个 zip 文件(仅文件名,不显示大小或路径等额外信息),然后仅显示前 30 个字符并将其存储在 n 变量中
  • 然后,它将每个 zip 文件的内容提取到一个新目录(使用 n 变量)。

就我而言,我将其放入从另一个目录运行的脚本中。

相关内容