
所以我有大約 20 000 個文件,我想按以下邏輯對其進行壓縮和分組:
- 壓縮每個具有相同字元的文件
(
- 還包括沒有的文件
(
所以文件就像
file_123.foo
file_123(abc).foo
file_123(b9)(ca)[a1].foo
foobar(a).foo
foobar.foo
foobar(123).foo
應該被壓縮為
file_123.7z
foobar.7z
我對 Windows 批次檔、Unix 腳本或任何壓縮程式持開放態度(我可以從那裡開始工作),儘管最方便的組合是 .7z 和 Windows。
更新
cYrus 給了我一個完美的答案,問題是我的問題不夠精確:) 現在我更聰明了,這是我還沒有弄清楚如何解決的下一組問題:
所以一切都很完美,除非發生這種情況:
file_123(abc).foo
file_123456789(b9).foo
這兩個不應該被分組,即它們應該最終出現在兩個單獨的文件中:
file_123.7z
file_123456789.7z
這個:
for pfx in $(for i in *.foo; do echo "${i%%[.(]*}"; done | sort -u); do 7z a "$pfx.7z" $pfx*; done
分別創建這兩個,但較短的文件起到包羅萬象的作用,即file_123.7z
包含這兩個文件,但它不應該包含在內。
答案1
Linux
這應該有效:
for pfx in $(for i in *.foo; do echo "${i%%[.(]*}"; done | sort -u); do 7z a "$pfx.7z" $pfx[.\(]*; done
解釋
首先,我們必須迭代所有輸入檔 ( *.foo
) 並去掉後綴 ( ${i%%[.(]*}
) 得到:
file_123
file_123
file_123
foobar
foobar
foobar
然後我們可以使用以下命令刪除重複項sort -u
:
file_123
foobar
最後,對於每個前綴 ( $pfx
),我們可以使用前綴本身作為存檔名稱 ( "$pfx.7z"
) 和識別檔案的模式 ( $pfx[.\(]*
) 來建立檔案;獲得相當於:
7z a file_123.7z 'file_123(abc).foo' 'file_123(b9)(ca)[a1].foo' 'file_123.foo'
7z a foobar.7z 'foobar(123).foo' 'foobar(a).foo' 'foobar.foo'
答案2
好的,我將向您展示 7zips 上下文選單,而不是只是給您一個 shell 腳本。
步驟1:打開包含所有這些文件的資料夾。
第2步:按一下「名稱」可依名稱對所有檔案進行排序(這樣可以輕鬆選擇具有類似名稱開頭的檔案)。
步驟3: 與正確的滑鼠按鈕,將選擇框拖曳到要壓縮到單一檔案中的所有檔案上(例如 foobar(a).foo、foobar.foo 、foobar(123).foo )
步驟4:當您放開滑鼠右鍵時,將出現上下文選單。轉到 7Zip > 新增到 PARENT_DIRECTORY.7z
其中 PARENT_DIRECTORY 是這些檔案所在資料夾的名稱。
步驟5:透過右鍵單擊新的 7Zip 檔案並按一下「重新命名」來重新命名該新的壓縮檔案。