仅知道扩展名从 zip 文件中提取单个文件

Phe*_*Pel 6 zip files

我的要求的第一部分:

我想从ex1234.zip. 的结构和内容ex1234.zip

ex1234 (directory)
    directory1
    ex1234 (directory)
    directory2
    ex1234.csv
Run Code Online (Sandbox Code Playgroud)

我希望能够只提取ex1234.csv文件但不知道名称。

第二部分是能够对exXXXX.zip位于同一目录中的所有内容执行此操作。

ex1234.zip
ex3245.zip
ex8829.zip
exXXXX.zip…
Run Code Online (Sandbox Code Playgroud)

输出将是:

ex1234.csv
ex3245.csv
ex8829.csv
exXXXX.csv
Run Code Online (Sandbox Code Playgroud)

真实样本:

少 $ CW2178470.zip
存档:CW2178470.zip
Zip 文件大小:26108 字节,条目数:26
-rw---- 2.0 脂肪 108 bl defN 15-Aug-04 09:37 CW2178470/CW2178470.csv
-rw---- 2.0 fat 1363 bl defN 15-Aug-04 09:37 CW2178470/config/BusinessContactApprovers.csv
-rw---- 2.0 fat 158 bl defN 15-Aug-04 09:37 CW2178470/CW2178470/announcements.xml
-rw---- 2.0 fat 1037 bl defN 15-Aug-04 09:37 CW2178470/CW2178470/Plan/plan.xml
-rw---- 2.0 fat 141 bl defN 15-Aug-04 09:37 CW2178470/CW2178470/Plan/tasks.xml
-rw---- 2.0 fat 2408 bl defN 15-Aug-04 09:37 CW2178470/CW2178470/FI_Doc208411460_doc.xml
-rw---- 2.0 fat 215 bl defN 15-Aug-04 09:37 CW2178470/CW2178470/MessageBoard/nb_27482kst.26ihyzj_.htm
-rw---- 2.0 fat 2364 bl defN 15-Aug-04 09:37 CW2178470/CW2178470/MessageBoard/messageboard.xml
-rw---- 2.0 脂肪 1250 bl defN 15-Aug-04 09:37 CW2178470/CW2178470/team.xml
-rw---- 2.0 fat 22016 bl defN 15-Aug-04 09:37 CW2178470/CW2178470/Doc208411460.doc
-rw---- 2.0 fat 9973 bl defN 15-Aug-04 09:37 CW2178470/CW2178470/audhistory.xml
-rw---- 2.0 脂肪 6731 bl defN 15-Aug-04 09:37 CW2178470/CW2178470/ws.xml
-rw---- 2.0 fat 308 bl defN 15-Aug-04 09:37 CW2178470/xsd/WSFolder.xsd
-rw---- 2.0 fat 4897 bl defN 15-Aug-04 09:37 CW2178470/xsd/Task.xsd
-rw---- 2.0 fat 770 bl defN 15-Aug-04 09:37 CW2178470/xsd/ContractWorkspace.xsd
-rw---- 2.0 fat 4754 bl defN 15-Aug-04 09:37 CW2178470/xsd/AuditHistory.xsd
-rw---- 2.0 fat 25564 bl defN 15-Aug-04 09:37 CW2178470/xsd/CommonTypes.xsd
-rw---- 2.0 fat 5657 bl defN 15-Aug-04 09:37 CW2178470/xsd/MessageBoard.xsd
-rw---- 2.0 fat 2471 bl defN 15-Aug-04 09:37 CW2178470/xsd/Plan.xsd
-rw---- 2.0 fat 337 bl defN 15-Aug-04 09:37 CW2178470/xsd/InternalContractWorkspace.xsd
-rw---- 2.0 fat 1045 bl defN 15-Aug-04 09:37 CW2178470/xsd/SalesContractRequest.xsd
-rw---- 2.0 fat 3133 bl defN 15-Aug-04 09:37 CW2178470/xsd/FolderItem.xsd
-rw---- 2.0 fat 906 bl defN 15-Aug-04 09:37 CW2178470/xsd/ContractRequest.xsd
-rw---- 2.0 fat 8973 bl defN 15-Aug-04 09:37 CW2178470/xsd/WorkspaceTypes.xsd
-rw---- 2.0 fat 4645 bl defN 15-Aug-04 09:37 CW2178470/xsd/Team.xsd
-rw---- 2.0 fat 781 bl defN 15-Aug-04 09:37 CW2178470/xsd/SalesContractWorkspace.xsd
26 个文件,112005 字节未压缩,21940 字节压缩:80.4%
(结尾)

don*_*sti 12

你可以这样使用unzip

unzip -j file[.zip] [file] [-x xfile]
Run Code Online (Sandbox Code Playgroud)

其中-j表示垃圾路径,file[.zip]是您的档案名称,[file]是要处理[-x xfile]的档案成员,是要从处理中排除的档案成员列表。所有这些选项都在手册页中详细描述。
所以在你的情况下,运行例如:

unzip -j ex1234.zip '*/*.csv' -x '*/*/*'
Run Code Online (Sandbox Code Playgroud)

将在当前目录中提取存档中*.csv与深度级别 2匹配的所有文件ex1234.zip(不包括深度级别 3 及以下的存档成员,因为'*/*/*'意味着路径至少匹配两个/)。

现在,要处理当前目录中的所有档案,您可以运行:

for zipfile in *.zip; do unzip -j "$zipfile" '*/*.csv' -x '*/*/*'; done
Run Code Online (Sandbox Code Playgroud)

.csv从当前目录中的每个存档中提取文件(这就是为什么-j需要)。
在您的特定情况下,没有.csv1 级深度,因此您也可以运行:

for zipfile in *.zip; do unzip -j "$zipfile" '*.csv' -x '*/*/*'; done
Run Code Online (Sandbox Code Playgroud)

这应该产生相同的结果。
要试运行并查看将提取哪些文件(它们的存档路径)而不实际提取它们,请替换-j-qql

for zipfile in *.zip; do unzip -qql "$zipfile" '*/*.csv' -x '*/*/*'; done
Run Code Online (Sandbox Code Playgroud)

作为旁注,如果要提取的文件位于深度级别 1(即没有父目录),则-j可以省略该选项;在这种情况下,您可以简单地运行:.csv

for zipfile in *.zip; do unzip "$zipfile" '*.csv' -x '*/*'; done
Run Code Online (Sandbox Code Playgroud)