3

我有一个文件夹,在 rsync 之后会有一个 zip 文件。我想把它解压到它自己的文件夹(如果zip是L155.zip,把它的内容解压到L155文件夹)。问题是我事先不知道它的名称(尽管我知道它将是“字母数字数字数字”),所以我必须将一个未知的文件解压缩到它的未知文件夹,这将自动完成。

命令“unzip *”(或 unzip *.zip)在终端中有效,但在脚本中无效。这些是通过终端一一执行的命令,但在脚本中不起作用。

#!/bin/bash
unzip * #also tried .zip and /path/to/file/*  when script is on different folder
i=$(ls | head -1)
y=${i:0:4}
mkdir $y
unzip * -d $y

首先我解压缩文件,然后我通过 ls 读取第一个提取文件的名称并将其保存在一个变量中。我取前 4 个字符并用它创建一个目录,然后再次将文件解压缩到该特定文件夹。

第一次解压完成后的整个过程,是因为.zip里面的文件,都是以zip已经有的名字开头的,所以如果L155.ZIP是zip,里面的文件就是L155* * *.txt。

zip 文件位于/path/to/file/NAME.zip. 当我运行脚本时,我收到如下错误:

unzip: cannot find or open /path/to/file/*.ZIP
unzip: cannot find or open /path/to/file//*.ZIP.zip
unzip: cannot find or open /path/to/file//*.ZIP.ZIP. No zipfiles found. 
mkdir: cannot create directory 'data': File exists data 
unzip: cannot find or open data, data.zip or data.ZIP.
4

5 回答 5

2

原始答案

假设其中foo.zip包含一个文件夹foo,您可以简单地运行

#!/bin/bash
unzip \*.zip \*

然后将其作为bash auto-unzip.sh.

如果您想将这些文件提取到不同的文件夹中,那么我会将上面的内容修改为

#!/bin/bash
cp *.zip /home/user
cd /home/user
unzip \*.zip \*
rm *.zip

当然,您将从存储所有 zip 文件的文件夹中运行。


另一个答案

另一个“简单”修复是获取dtrx(也可在 Ubuntu 存储库中获得,可能适用于其他发行版)。这会将您的每个文件提取*.zip到其自己的文件夹中。因此,如果您希望将数据放在不同的文件夹中,我将按照第二个示例进行更改:

#!/bin/bash
cp *.zip /home/user
cd /home/user
dtrx *.zip
rm *.zip
于 2013-09-24T19:31:54.857 回答
1

如果文件夹中只有后缀为 的文件.zip,您可以使用工具提取不带后缀的文件名basename

BASE=$(basename *.zip .zip)

如果有多个文件匹配,这将产生一条错误消息*.zip

只是为了清楚这里的问题,假设 zip 文件不包含文件夹结构。如果是这样,就没有问题;您可以简单地将其提取到子文件夹中unzip。仅当您的 zipfile 包含松散文件并且您希望将它们提取到子文件夹中时,才需要以下内容。

有了这个警告,以下应该有效:

#!/bin/bash
DIR=${1:-.}
BASE=$(basename "$DIR/"*.zip .zip 2>/dev/null) ||
  { echo More than one zipfile >> /dev/stderr; exit 1; }
if [[ $BASE = "*" ]]; then
  echo No zipfile found >> /dev/stderr
  exit 1
fi
mkdir -p "$DIR/$BASE" ||
  { echo Could not create $DIR/$BASE >> /dev/stderr; exit 1; }
unzip "$DIR/$BASE.zip" -d "$DIR/$BASE"

把它放在一个文件中(任何地方),把它叫做unzipper.sh, 和chmod a+x它。然后你可以这样称呼它:

/path/to/unzipper.sh /path/to/data_directory
于 2013-09-24T19:15:50.053 回答
1
for zfile in $(find . -maxdepth 1 -type f -name "*.zip")
do
  fn=$(echo ${zfile:2:4})  # this will give you the filename without .zip extension
  mkdir -p "$fn"  
  unzip "$zfile" -d "$fn"
done
于 2013-09-24T19:21:01.387 回答
1

我会尝试以下。

for i in *.[Zz][Ii][Pp]; do
    DIRECTORY=$(basename "$i" .zip)
    DIRECTORY=$(basename "$DIRECTORY" .ZIP)
    unzip "$i" -d "$DIRECTORY"
done

如前所述,basename 程序会.zip从提供的文件名中删除指定的后缀。

我已将其编辑为不区分大小写。两者都.zip.ZIP被认可。

于 2013-09-24T19:21:13.277 回答
0

我一直使用的简单的一种衬里

$ for file in `ls *.zip`; do unzip $file -d `echo $file | cut -d . -f 1`; done
于 2016-11-09T22:01:16.183 回答