我有这些 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|'
并使用它而不是cut
在for
循环中。
该替换的细分是您替换为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 变量)。
就我而言,我将其放入从另一个目录运行的脚本中。