解压未知名称文件的Bash脚本

解压未知名称文件的Bash脚本,bash,pattern-matching,unzip,glob,Bash,Pattern Matching,Unzip,Glob,我有一个文件夹,在rsync之后会有一个zip。我想将其解压缩到自己的文件夹(如果zip为L155.zip,则将其内容解压缩到L155文件夹)。问题是,我事先不知道它的名字(虽然我知道它将是“字母号”),所以我必须将uknown文件解压缩到它的未知文件夹,这将自动完成 命令“unzip*”(或unzip*.zip)可以在终端中工作,但不能在脚本中工作。 这些命令一个接一个地通过终端运行,但在脚本中不起作用 #!/bin/bash unzip * #also tried .zip and /pat

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

命令“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.

如果文件夹只有扩展名为
.zip
的文件,则可以使用
basename
工具提取不带扩展名的名称:

BASE=$(basename *.zip .zip)
如果有多个文件匹配
*.zip
,则会生成错误消息

为了澄清这里的问题,假设zip文件不包含文件夹结构。如果是的话,就没有问题了;您只需使用
解压
将其解压缩到子文件夹中即可。仅当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
,以及
chmoda+x
它。然后你可以这样称呼它:

/path/to/unzipper.sh /path/to/data_directory

我会尝试以下方法

for i in *.[Zz][Ii][Pp]; do
    DIRECTORY=$(basename "$i" .zip)
    DIRECTORY=$(basename "$DIRECTORY" .ZIP)
    unzip "$i" -d "$DIRECTORY"
done
如前所述,basename程序从提供的文件名中删除指定的后缀
.zip


我已将其编辑为不区分大小写。
.zip
.zip
都将被识别。

原始答案

假设
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文件的文件夹中运行


另一个答案

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

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

简单的一行我一直在用

$ for file in `ls *.zip`; do unzip $file -d `echo $file | cut -d . -f 1`; done

你应该试着比“不起作用”更具体一些。这是什么意思?它是否会产生错误消息?如果是,信息是什么?它会做一些意想不到的事情吗?如果是这样的话,它做了什么?它与您的期望有什么不同?好吧,首先在尝试执行脚本时,我得到解压:无法找到或打开/path/to/file/*.ZIP、/path/to/file//*.ZIP.ZIP或/path/to/file/*.ZIP.ZIP。没有找到拉链。mkdir:无法创建目录“data”:文件存在数据解压:无法找到或打开data、data.zip或data.zip。“。希望现在更好:)凯尔·卡诺斯,这似乎不起作用,否则我做错了。@user2809595:脚本存储在哪里并不重要。当您调用脚本时,最重要的是当前的工作目录。它应该在zip的文件夹中吗?我的意思是,.zip文件位于/home/user/data文件夹中,脚本位于/home/user。然后我必须用其他命令运行另一个脚本?Kyle,这与
解压'*.zip'
有什么不同?当然,通配符规范
*
只是指“所有文件”,如果不指定模式,这是默认值?而且,只有在zipfile是用正确的顶级文件夹名创建的情况下,这才有效。@rici:(1)您认为它会有所不同吗?(2) 在这个问题上有人提到过吗?(3) 是否在OP中指定了文件将转到顶级文件夹以外的其他位置?答案:不。不。不。所以你的问题是…?@取证:我正在调整我的答案以反映你的评论。作为对(3)的回应,我是这样解释的:“我想将其解压缩到自己的文件夹(如果zip是L155.zip,则将其内容解压缩到L155文件夹)?”和(2)所有其他答案都使用
-d
选项来完成该精确任务。显然,如果zip文件是在第一张牌中用文件夹结构创建的,那就容易多了。
$(find*.zip)
*.zip
之间没有什么区别,只是如果有一个名为
something.zip
的目录,前者就不能满足您的需要,而且它会占用更多的资源。如果zipfile的名称中有空格,这两个文件都会以令人讨厌的方式失败。这个文件给出了“find:`*.zip”:没有这样的文件或目录。脚本与位于同一文件夹中。zip@forensick:那么,您的问题不是解压缩。将
pwd
作为脚本中的第一个命令,并查看它正在搜索哪个目录。s:~/data$./yourscript.sh/home/manolis/data find:`*.zip':没有这样的文件或目录数据是同时包含脚本和.zipy的文件夹。如果您没有错误,问题是文件以.zip结尾,而不是.zip结尾。现在我纠正了这个问题,我得到了“Archive:K197.ZIP checkdir:cannotcreate extraction directory:K197.ZIP File exists”
$(find.-type f-name“*.ZIP”)
将在所有子目录中搜索Zipfile,这不是原始问题的一部分。此外,它还将返回类似于
/F143.zip
(或
/子目录)的结果
$ for file in `ls *.zip`; do unzip $file -d `echo $file | cut -d . -f 1`; done