Czy istnieje sposób na skompresowanie wszystkich plików w danym katalogu za pomocą zip
polecenia? Słyszałem o używaniu *.*
, ale chcę, aby działał również dla plików bez rozszerzeń.
command-line
wildcards
zip
tkbx
źródło
źródło
zip myarch.zip mydir/*
?zip -r myarch.zip mydir/*
zip -r myarch.zip mydir
*.*
oznacza dowolny plik z kropką. W cp / m i dos wszystkie pliki miały kropkę, co spowodowało, że wpisałeś (nie można tego zrobić*
). Dlatego ludzie zaczęli widzieć*.*
wszystkie pliki. W końcu Microsoft dodał długie nazwy plików, które mogą mieć zero lub więcej kropek. Aby znaleźć plik z kropką w systemie Windows, musisz wpisać*.*.*
.Odpowiedzi:
Możesz po prostu użyć
*
; nie ma takiej potrzeby*.*
. Rozszerzenia plików nie są wyjątkowe w Uniksie.*
dopasowuje zero lub więcej znaków - w tym kropkę. Więc pasujefoo.png
, ponieważ to zero lub więcej znaków (dokładnie siedem).Zauważ, że
*
domyślnie pliki nie zaczynają się od kropki (również nie*.*
). To jest często to, czego chcesz. Jeśli nie, w bash, jeślishopt -s dotglob
to zrobisz (ale nadal będzie wykluczać.
i..
). Inne powłoki mają różne sposoby (lub wcale nie obejmują) plików kropkowych.Alternatywnie,
zip
ma również-r
opcję (rekurencyjną) do robienia całych drzew katalogów jednocześnie (i nie musisz martwić się o problem z plikiem kropkowym):gdzie
mydir
jest katalog zawierający twoje pliki. Zauważ, że utworzony zip będzie zawierał zarówno strukturę katalogów, jak i pliki. Jak zauważa Peter w swoim komentarzu, jest to zwykle postrzegane jako dobra rzecz: rozpakowanie zip zachowa wszystkie wyodrębnione pliki w jednym podkatalogu.Możesz także powiedzieć zipowi, aby nie zapisywał ścieżek za pomocą opcji
-j
/--junk-paths
.zip
Polecenie pochodzi z dokumentacji informujący o wszystkich swoich (wiele opcji); wpisz,man zip
aby zobaczyć tę dokumentację. Nie jest to unikalne dla zip; w ten sposób można uzyskać dokumentację dla większości poleceń.źródło
*
globowanie powłoki nie obejmuje plików dot (tj. Nazw plików rozpoczynających się od.
). Jest to kolejna zaleta spakowania całego katalogu według nazwy..
i..
?W moim przypadku chciałem spakować każdy plik do jego własnego archiwum, więc zrobiłem (in
zsh
):źródło
mkv
tutaj? Również tutaj nic nie jest szczególniezsh
specyficzne. Będziesz chciał poprawnie cytować dowolną zmienną zawierającą nazwę pliku, więczip "${file%.*}.zip" "$file"
z podwójnymi cudzysłowami wokół obu zmiennych.mkv
. Po drugie, cytowanie argumentów jest niepotrzebne wzsh
przeciwieństwie dobash
. Właśnie dlatego podałem, że to było poleceniezsh
.find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"'
(z-P
dostosowaniem w zależności od wątków procesora ...) (Wiele zależności GNU ...)Innym sposobem może być użycie find i xargs: (może to zawierać katalog „.” W pliku zip, ale nadal powinien być wypakowany poprawnie. Za pomocą mojego testu zip usunął kropkę przed kompresją)
find . -type f -exec zip zipfile.zip {} +
(
+
Można zastąpić,\;
jeśli twoja wersjafind
nie obsługuje+
końca dla exec. Będzie jednak wolniejsza ...)Obejmuje to domyślnie wszystkie podkatalogi. Na GNU find
-maxdepth
może temu zapobiec.źródło
*
, będzie to obejmować pliki kropkowe i nie przewróci się, jeśli w katalogu będzie zbyt wiele plików)Inna (powolna) metoda, aby to zrobić (która dodaje jeden plik do zipu na raz):
Ma to problemy z plikiem kropkowym
*
(dodane obejście) i byłby uruchamiany zip raz dla każdego pliku, dodając go do archiwum. Wbash
, poradziłby sobie z dużą ilością plików.Byłby wolniejszy niż większość innych metod, ale jest stosunkowo prosty.
źródło
for f in *; do zip zip.zip "$f"; done