
我有一堆 .zip 和 .rar 檔案。其中許多文件在存檔中包含子資料夾。我想從 zip 檔案中刪除所有資料夾,但保留其他內容。
例如
original.zip
- /foo/bar1.jpg
- /foo/bar2.jpg
- /foo/bar3.jpg
- /foo/bar4.jpg
>>>
new.zip
- bar1.jpg
- bar2.jpg
- bar3.jpg
- bar4.jpg
這可以是純終端命令或 bash 腳本。我需要能夠同時在 100 個 zip/rar 檔案上運行它。
更新: 如果不重新建立 zips + rars,這似乎是不可能的。
所以我編寫了一個小 bash 腳本,它創建了兩個目錄,“cleaned”用於後處理文件,“temp”用於解壓縮文件。它會循環遍歷當前目錄中的所有存檔(.cbr 和 .cbz 檔案),為每個新檔案建立一個“乾淨的名稱”,將舊檔案解壓縮到臨時目錄,從臨時檔案建立一個新存檔並儲存它在「cleaned」目錄中使用clean 名稱,然後清除暫存資料夾。處理所有檔案後,「temp」目錄將會被遞歸刪除。它看起來像這樣:
#!/bin/bash
echo "comic cleaning!";
echo "---------------";
dir=$(pwd)/;
tmp=${dir}temp/;
clean=$(pwd)/cleaned;
cd $dir;
mkdir -p cleaned;
mkdir -p temp;
for z in *.cb*; do
cd $dir;
filename=$(basename "$z");
rawname="${filename%.*}";
name="${rawname// /_}";
7z e "$dir$z" -otemp/;
cd $tmp && zip -r $clean/$name.cbz *.jpg;
cd $tmp && rm *.*;
done
cd $dir && rm -rf $tmp;
我可能應該使用 os /tmp 目錄,但我對 bash 仍然是新手,無法讓它工作。有什麼優化建議嗎?
答案1
如果所有檔案名稱都是唯一的,您的小腳本可能會起作用。你會有這樣的條件嗎?
original.zip
- /foo/bar1.jpg
- /foo/bar2.jpg
- /zoo/bar1.jpg
- /zoo/bar2.jpg
您將覆蓋文件。更好的解決方案可能是將完整路徑作為新檔案名稱的一部分。前任:
foobar1.jpg foobar2.jpg Zoobar1.jpg Zoobar2.jpg
但這樣一來,您將丟失原始檔案名稱。
只是一些想法...