Złożyłem skrypt, aby wykonać dla mnie pewne operacje na plikach. Korzystam z operatora wieloznacznej karty, *
aby zastosować funkcje do wszystkich plików danego typu, ale jest jedna rzecz, której nie rozumiem. Mogę unzip
wszystkie pliki w takim folderze
unzip "*".zip
Jednak, aby później usunąć wszystkie pliki zip, muszę to zrobić
rm *.zip
Oznacza to, że nie chce znaków cudzysłowu. Z drugiej strony rozpakowanie nie działa, jeśli po prostu dam mu * (ostrzega mnie, że „pliki nie zostały dopasowane”).
Dlaczego to jest inne? Wydaje mi się, że to dokładnie ta sama operacja. A może źle używam dzikiej karty?
Przedstawienia dzikiej karty w Uniksie tak naprawdę nie wchodzą w to, i nie mogłem znaleźć niczego w dokumentach rm
ani zip
.
Korzystam z terminala na komputerze Mac (Yosemite).
unzip
to zrobić bez normalnejfor f in *.zip;do...done
pętli powłoki. Taki dziwny interfejs użytkownika, który nie przypomina unixa.unzip
stosuje glob do zawartości archiwum; nie można ich zdobyć z paczki za pomocą symbolu wieloznacznego. (Będziesz potrzebować `` dla f inunzip -l archive.zip
; do ... gotowe ')unzip
akceptowaniu globów w jednym pliku zip. Ale to jest inne; W rzeczywistości próbowałemunzip '*.zip'
w katalogu z wieloma plikami zip i wyodrębnia wszystkie pliki ze wszystkich zamków błyskawicznych. Tak jak powiedziałem, super dziwne.tar
nie ma takiego trybu działania.Odpowiedzi:
Bardzo dobrze wyjaśniłeś sytuację. Ostatni element układanki jest w stanie
unzip
poradzić sobie z symbolami wieloznacznymi:http://www.info-zip.org/mans/unzip.html
Cytując * symbol wieloznaczny, uniemożliwiłeś jego powłoce rozwinięcie go, dzięki czemu zobaczysz
unzip
znak wieloznaczny i zajmie się rozszerzaniem go zgodnie z własną logiką.rm
, Natomiast nie obsługuje symboli wieloznacznych na własną rękę , więc próbuje zacytować wieloznaczny poinstruujerm
szukać dosłownym gwiazdką w pliku zamiast.Przyczyną,
unzip *.zip
która nie działa, jest takaunzip
składnia, która po prostu nie pozwala na wiele plików zip; jeśli istnieje wiele parametrów, oczekuje się, że drugi i kolejne będą plikami w archiwum:źródło
unzip
własnym językiem, w drugim przypadku ogólne żargon unixowy?for f in *.zip ; do unzip -v "$f" ; done
. i duża część powodów, dla których powłoka sama rozszerza nazwę pliku itp., jest taka, że każdy program nie musi tego robić (co skutkowałoby mnóstwem niezależnie napisanych implementacji interpretacji symboli wieloznacznych, które różniłyby się na małe, ale irytujące) .Różnica między tymi dwoma poleceniami polega na cytowanym
*
znaku. Jeśli wywołasz polecenie w powłoce i użyjesz*
znaku jako argumentu, sama powłoka oceni argument. Zobacz ten przykład:Teraz z
*
:Powłoka ocenia symbol wieloznaczny i buduje polecenie w następujący sposób:
Z cytowanym znakiem wieloznacznym jest interpretowany jako plik o nazwie (dosłownie)
*.zip
:Nie
unzip
można wywołać narzędzia z wieloma spakowanymi plikami jako argumentami. Ale twórca wybrał na to inny sposób. Z strony podręcznika:źródło
unzip
zdecydowali się pójść tą drogą, a nie dopuszczać wielu spakowanych plików jako argumentów?Różnica polega na tym, że w pierwszym przypadku sama powłoka rozszerza glob:
podczas gdy w drugim przypadku sama aplikacja robi coś o tym dosłownym charakterze:
Jeśli nie jest cytowany, powłoka najpierw rozszerza glob, a polecenie zostanie uruchomione z tym, do czego rozszerza się glob globu.
źródło
Polecenie otrzyma argumenty po przetworzeniu przez powłokę.
Przy pierwszym przetwarzaniu niecytowana
*
zostanie rozwinięta przez powłokę (do listy plików w bieżącym katalogu (pwd), które pasują do wzorca):Wyświetla listę wszystkich
.zip
plików. Ale nieecho "*".zip"
będzie .Przy pierwszym przetwarzaniu cytowany
"*"
nie zostanie rozwinięty, zostanie przekazany do polecenia rozpakuj jako parametr (po usunięciu cytowania). Polecenie unzip otrzyma parametr*.zip
:Jest to polecenie rozpakuj, które rozszerza
*
listę plików.Interesujące jest również to, że te dwa polecenia nie wykonają dokładnie tej samej czynności końcowej i kto rozszerzy
*
zmiany:Pierwsze polecenie otrzymuje
*.zip
rozszerzenie, które przetwarza wszystkie pliki. Drugie polecenieunzip
otrzyma listę wszystkich.zip
plików w pwd, których nie przetworzy, ponieważ programista rozpakujący postanowił odrzucić rozszerzenie więcej niż jednegozip
pliku.źródło
Cytaty są potrzebne, ponieważ zip obsługuje wiele argumentów:
rm
: usuń wszystkie pliki z listy argumentówzip
: rozpakuj plik w pierwszym argumencie. wyodrębnij pliki tylko z pozostałych argumentów.jak widać, próbuje znaleźć file2.zip i file3.zip w pliku file1.zip
aby umożliwić wyodrębnienie wielu plików zip jednocześnie, zip obsługuje interpretację globu z innym rezultatem.
źródło