我的要求的第一部分:
我想从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
需要)。
在您的特定情况下,没有.csv
1 级深度,因此您也可以运行:
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)