Jak mogę znaleźć wszystkie pliki określonego typu / nazwy i skopiować je o -n poziom wyżej ? Oto struktura drzewa systemu plików:
germany/
|
adventure/
|
300x600/
| |
| file1.jpg
| file2.zip
|
400x600/
|
file8.jpg
file4.zip
switzerland/
|
adventure/...
Istnieje wiele folderów krajowych, około 20, a pliki .zip nie mają gwarancji głębokości 3 poziomów. Obecnie jestem w ich folderze nadrzędnym countries/
i chcę znaleźć i skopiować wszystkie pliki .zip w górę o jeden poziom, do adventure/
katalogu odpowiedniego kraju / folderu.
Próbowałem:
find . -type f -name '*.zip' -exec mv {}/.. \;
ale ten nieszczęśliwie zawiódł. Przesuwało każdy plik o jeden poziom wyżej, a następnie były przenoszone jeszcze raz o jeden poziom wyżej.
Dzięki!
EDYCJA:
Grałem trochę z rozwiązaniami z odpowiedzi i czytałem dużo man
stron :). Wreszcie zaakceptowałem rozwiązanie, które najbardziej mi się podobało, ponieważ jest eleganckie i niezależne od powłoki.
Nadal próbuję coś wymyślić:
- Czy
find
działa jako pętla lub czy nawiasy klamrowe są traktowane jako „lista / tablica” w innych językach programowania? Czyli: czy wypełnia się znalezionymi wynikami (tzn. Ciągami) naraz, a następnie przekazuje się polecenie poniżej-exec
? - Dlaczego przeniesienie miało miejsce najpierw o jeden poziom wyżej, a następnie o jeden poziom wyżej?
- Czy istnieje sposób, aby od razu powiedzieć,
mv/cp
aby przejść -n poziomy [góra / dół]?
mv
polecenia. Zakładam, że chcesz skopiować pliki, jak mówią tytuł i wprowadzenie.mv
lubcp
nie ma znaczenia, mogę używać i obsługiwać oba :) Tak więcfind
znajduje ścieżki do plików .zip, wypełnia{}
„obiekt” wynikami.-exec
wykonuje sięsh -c
z opcją „read from string” (-c), która „definiuje” (?) dwa argumenty - pierwszy argument będzie pierwszypath/to/file.zip
z wyników{}
. Następnie wyodrębnij katalog-rodzic-plik-pliku, w końcu przejdź na wyższy poziom icp
plik. Poprawny?sh
tym przypadku wywołanie ma dwie-c "cmd"
opcje argumentów, jedna to (= „weź polecenia do wykonania z ciągu, który następuje”), a druga to{}
, jak to słusznie mówisz, ścieżka do pierwszego znalezionego pliku, następnie w drugiej pętli drugi plik itp.-exec sh -c "…"
Podejście to jest bardzo przydatne w przypadku bardziej złożonychfind
skryptów, dla których w innym przypadku musiałbyś napisać kilka pętli.$0
to pierwszy argument przekazany dosh -c '…'
. Możesz uruchomić,sh -c 'echo $0 $1 $2' foo bar baz
a dostanieszfoo bar baz
jako wynik. W twoim przypadku pierwszym argumentem był{}
któryfind
zastępuje ze ścieżką do znalezionego pliku. Tak więc pierwszym argumentemcp
jest ścieżka do pliku. Drugi argument musi być folderem nadrzędnym pliku, więc najpierw musimy uzyskać nazwę folderu…wypróbowałem to z Ubuntu Zsh 5.0.2:
źródło
adventure/
podkatalogugermany/
katalogu. Istnieją też inne katalogi nazwane według nazw krajów, więc chciałbym móc wydać polecenie dla wszystkich (np. Austria / Niemcy / ...). Dziękigermany
), Nie dla wszystkich.Tylko szybka alternatywa, jeśli rzeczywistość jest tak prosta, jak podany przykład:
(i nie ma zillion plików)
źródło
germany
. Potrzebujesz pętli nad wszystkimi folderami.