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ć?


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.