将 .zip 文件列表提取到每个新目录中,目录名称取自 zip 文件的名称

将 .zip 文件列表提取到每个新目录中,目录名称取自 zip 文件的名称

我有一个包含许多.zip文件的文件夹。它们的名字是这样的:

John-Rupert A. Doe_nnnnnnn_assignsubmission_file_*.zip

其中n是数字,*是字符串,John-Rupert A. Doe是可能包含空格、点和破折号的字符串。

对于他们每个人,我想做以下事情:

  1. 创建一个目录。我通过以下方式执行此操作:

    ls | cut -d'_' -f 1 | sed 's/ //g' | tr -d '.' | tr -d '-' | xargs -L 1 mkdir
    

    (因此,上面示例的相应目录名称为JohnRupertADoe

  2. 现在我想将每个文件提取到使用此文件名.zip创建的目录中。.zip但如何呢?

答案1

你可以尝试:

for z in ./*.zip
do name="${z%%_*}"; dest=".${name//[ .-]/}"; mkdir "$dest"; unzip "$z" -d "$dest"
done

对于每个zip 文件,它提取名称部分(${z%%_*}贪婪地删除后缀),然后删除所有出现的点、破折号和空格 ( ${name//[ .-]/}),并将生成的字符串作为参数传递以mkdir创建相应的目录。然后它将存档解压缩到指定的d目的地。

答案2

未经测试:

for i in *.zip; do
  zipdir() { echo "$i" | cut -d'_' -f 1 | sed 's/ //g' | tr -d '.' | tr -d '-'; }
  zipdir | xargs -L 1 mkdir
  mv "$i" "$(zipdir)"/
done

或者要删除两个tr管道,您可以将管道添加到sed(也未经测试):

for i in *.zip; do
  zipdir() { echo "$i" | cut -d'_' -f 1 | sed 's/ //g;s/.//g;s/-//g'; }
  zipdir | xargs -L 1 mkdir
  mv "$i" "$(zipdir)"/
done

相关内容