Skrypt powłoki, aby przenieść wszystkie pliki z podfolderów do folderu nadrzędnego

47

Mam kilka folderów w folderze A. Chcę przenieść pliki ze wszystkich tych folderów do A.

Lub

Chcę wyciąć wszystkie pliki z folderów podrzędnych i wkleić je do folderu nadrzędnego.

Jak to zrobić?

Rahul Virpara
źródło
1
Tak naprawdę nie przetestowałem tego pod kątem niezawodności ani niczego, ale próbowałeś po prostu wpisać to polecenie z folderu A w terminalu mv */* .:?
Marty Fried
Czy na pewno nie ma zduplikowanych nazw plików?
jippie
mv */* .nie przenosi plików z podfolderów podfolderów.
Rahul Virpara
@jippie tak, nie ma zduplikowanych nazw
Rahul Virpara

Odpowiedzi:

81

Przejdź do Akatalogu i uruchom

find . -mindepth 2 -type f -print -exec mv {} . \;

co oznacza „znajdź wszystkie pliki w tym katalogu i jego podkatalogach i uruchom mv z katalogiem docelowym. dla każdego znalezionego pliku przenieś je do bieżącego katalogu.

Tuminoid
źródło
1
próbuje także przenieść pliki, które są już w katalogu nadrzędnym.
Rahul Virpara
virpara: teraz to wydanie zapomina o wszystkich plikach w katalogach .dot. Zmieniono go o -mindepth 2, aby ukryć ostrzeżenia.
Tuminoid
1
Z GNU findmożesz być trochę bardziej elegancki i nie spawnować mvprocesu dla każdego pliku:find A -mindepth 2 -type f -exec mv -t A \{\} +
David Foerster
David, twoja wersja działa, dopóki nie osiągniesz limitu maksymalnej długości wiersza poleceń, co nie jest trudne, biorąc pod uwagę, jak find wypisuje ścieżki, szczególnie w przypadku, gdy wywołujesz go z katalogu innego niż A, jak w twoim przykładzie.
Tuminoid
9
To jest bardzo niebezpieczne. jeśli masz pliki o tej samej nazwie w różnych podfolderach, zastąpisz je ostatnim znalezieniem. Lepiej używać mv z --backup = numerowane:find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
pLumo
4

Cóż, możesz utworzyć plik i nazwać go „cutme” (aby utworzyć plik o nazwie cutme w typie terminala nano cutme. Aby go zapisać, naciśnij na przykład CTRL + X, a następnie naciśnij ENTER) i wklej w nim następujące elementy, zakładając, że:

  1. Chcesz to zrobić rekurencyjnie (w podfolderach i podfolderach tych podfolderów)
  2. Chcesz pominąć przenoszenie pliku skryptu
  3. Masz uprawnienia do przenoszenia plików w tym folderze
  4. Pliki mogą zawierać spacje w swoich nazwach

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Zanotuj nazwę cutme w linii. Powinien być taki sam jak skrypt, który uruchomisz.

Po utworzeniu pliku i wklejeniu powyższego wiersza uruchom następujące polecenie w tym samym folderze co skrypt:

chmod +x cutme. To daje nowy plik flagę „wykonywalny”, dzięki czemu można wykonać go tak: ./cutme.

Luis Alvarado
źródło
Dlaczego powinienem próbować przenosić pliki, które są już w katalogu nadrzędnym?
Rahul Virpara
Uruchomiłbyś skrypt z folderu. Każdy plik w nim, jeśli jest w podfolderze lub nie, zostanie przeniesiony do folderu nadrzędnego folderu. Folder nadrzędny tutaj jest nadrzędny w stosunku do miejsca, w którym znajduje się skrypt. Właściwie zmieniając ostatnie 2 kropki, możesz powiedzieć, gdzie przenieść wszystkie pliki do folderu, w którym uruchamiasz skrypt.
Luis Alvarado