Mám jeden adresář, který obsahuje desítky adresářů.
Jsem nový v příkazovém řádku a snažím se přijít s příkazem, který zazipuje každý podadresář do jedinečného souboru podadresář.zip.
Takže nakonec bude můj primární adresář vyplněn všemi mými původními podadresáři plus odpovídající .zip
soubory, které obsahují zazipovaný obsah každého podadresáře.
Je něco takového možné? Pokud ano, ukažte mi, jak se to dělá.
Přijatá odpověď:
Tuto smyčku můžete použít v bash
:
for i in */; do zip -r "${i%/}.zip" "$i"; done
i
je název proměnné smyčky. */
znamená každý podadresář aktuálního adresáře a v těchto názvech bude obsahovat koncové lomítko. Ujistěte se, že cd
na správné místo, než to provedete. "$i"
jednoduše pojmenuje tento adresář, včetně koncového lomítka. Uvozovky zajišťují, že mezery v názvu adresáře nezpůsobí potíže. ${i%/}
je jako $i
ale s odstraněným koncovým lomítkem, takže jej můžete použít k vytvoření názvu souboru zip.
Pokud chcete vidět, jak to funguje, přidejte echo
před zip
a uvidíte příkazy vytištěné místo provedení.
Paralelní provádění
Chcete-li je spustit paralelně, můžete použít &
:
for i in */; do zip -0 -r "${i%/}.zip" "$i" & done; wait
Používáme wait
říct shellu, aby před ukončením počkal na dokončení všech úloh na pozadí.
Pozor, pokud máte ve svém aktuálním adresáři příliš mnoho složek, můžete zahltit svůj počítač, protože tento kód neomezuje počet paralelních úloh.