Bash

使用單個文件解壓縮存檔並重命名輸出以匹配存檔名稱

  • March 7, 2018

目標是解壓縮許多 zip 文件並將生成的文件重命名為原始存檔名稱。

給定一個包含許多 zip 文件的文件夾,其中大多數包含一個名為 的文件bla.txt,但當然也有一些例外。眾所周知,每個文件都有一個文件,即 txt 文件。

./zips/
   a.zip - contains bla.txt
   b.zip - contains bla.txt
   c.zip - contains somethingelse.txt
   d.zip - contains bla.txt
   ...   - ...

輸出應該是

./zips/
   a.txt
   b.txt
   c.txt
   d.txt
   ...  

目前最佳鏡頭,它提取了所有內容,但給我留下了大量文件夾:

for z in *.zip; do unzip $z -d $(echo 'dir_'$z); done

也許像

for z in *.zip; do unzip $z; mv 'content_name.txt' $z; done

但是內容名稱是如何獲得的呢?

您可以繼續這個-d想法,只需將任何提取的文件重命名為所需的“zip 名稱減去 zip 加 txt”:

mkdir tmp
for f in *.zip; do unzip "$f" -d tmp && mv tmp/* "${f%.zip}.txt"; done
rmdir tmp

或者,您可以將 unzip 的輸出通過管道傳輸到適當命名的文件中:

for f in *.zip; do unzip -p "$f" > "${f%.zip}.txt"; done

該命令unzip有其自己的選項unzip -Z1 zipfile.zip來顯示壓縮文件中的實際壓縮文件名,該zipinfo's選項-1採用zipinfo -1 zipfile.zip. 因此您可以簡單地執行以下操作,無需創建臨時目錄,mv並將在目前目錄中完成。

for z in *.zip; do 
   unzip "$z";
   mv "$(unzip -Z1 $z)" "${z%%.*}.txt";
done

引用自:https://unix.stackexchange.com/questions/382390