2012-10-17 40 views
0

我需要解壓縮與名稱中的特定關鍵字匹配的文件。一個典型的文件將是這樣的:指定關鍵字時解壓縮失敗

JGS-Memphis~PSU~FVT~00000~JGM96911~1~P~1100~EPS10R0-15~CL10D1120A3271~0121017~141645.XML 

當我做

unzip -o SOMEFILE.zip '*~PSU~*' -d psutmp/ 

SOMEFILE.zip解壓上述文件沒有問題。但是當我做

for i in `find . -name '*zip'`; do unzip -o "$i" \'*PSU*\' -d psutmp/ ; done 

它失敗,並出現filename not matched: '*PSU*'錯誤。我試圖刪除PSU周圍的刻度線。同樣的問題。

我也試過-C選項來與之匹配文件名大小寫不敏感

for i in `find . -name '*XML*zip'`; do unzip -o "$i" -C *PSU* -d psutmp/ ; done 

它失敗了

error: cannot create psutmp/JGS-Memphis~PSU~FVT~00000~JGM96911~1~P~1100~EPS10R0-15~CL10D1120A3271~0121017~141645.XML 

這是無稽之談。我是擁有150GB存儲空間的開發機器的根本用戶。容量在12%。我錯過了什麼?

回答

3

刪除\'*P5U*\'中的反斜槓。你不需要逃避單引號。

for i in `find . -name '*zip'`; do unzip -o "$i" '*PSU*' -d psutmp/ ; done 

在for循環中使用反引號有點代碼味道。我想嘗試以下內容之一:

# Unzip can interpret wildcards itself instead of the shell 
# if you put them in quotes. 
unzip -o '*.zip' '*PSU*' -d psutmp/ 

# If all of the zip files are in one directory, no need for find. 
for i in *.zip; do unzip -o "$i" '*PSU*' -d psutmp/; done 

# "find -exec" is a nice alternative to "for i in `find`". 
find . -name '*.zip' -exec unzip -o {} '*PSU*' -d psutmp/ \; 

至於錯誤推移,確實存在psutmp/?是否設置了權限以便您可以寫入?

+0

'find。 -name'* .zip'-exec unzip -o {}'* PSU *'-d psutmp/\;'照顧它。它實際上比循環更有效(不知道我在想什麼......)。接受並投票決定。謝謝。 – Chris

相關問題