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.
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:
Chcesz to zrobić rekurencyjnie (w podfolderach i podfolderach tych podfolderów)
Chcesz pominąć przenoszenie pliku skryptu
Masz uprawnienia do przenoszenia plików w tym folderze
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.
mv */* .
:?mv */* .
nie przenosi plików z podfolderów podfolderów.Odpowiedzi:
Przejdź do
A
katalogu i uruchomco 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.
źródło
find
możesz być trochę bardziej elegancki i nie spawnowaćmv
procesu dla każdego pliku:find A -mindepth 2 -type f -exec mv -t A \{\} +
find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
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: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
.źródło