Jak przenieść pliki z zagnieżdżonych podkatalogów do innego folderu w Ubuntu? (Próbuje usunąć wiele podfolderów)

36

Jak przenieść pliki, a nie katalogi do innego folderu / folderu nadrzędnego?

Mam strukturę folderów, która jest wyjątkowo brzydka, a niektóre pliki .mp3 są głęboko ukryte w podfolderze na 6 poziomach.

Chcę skończyć ze wszystkimi plikami (głównie .mp3, ale nie wszystkimi) w jednym katalogu, bez żadnych podkatalogów, używając Ubuntu.

Wsparcie?

Chris
źródło

Odpowiedzi:

48

Istnieje świetna odpowiedź w askubuntu-QA .

Aby to zrobić, otwórz terminal i wykonaj następujące polecenie:

mv  -v ~/Downloads/* ~/Videos/

Przeniesie wszystkie pliki i foldery z folderu Pobrane do folderu Wideo.


Aby przenieść wszystkie pliki, ale nie foldery:

Jeśli jednak chcesz przenieść wszystkie pliki (ale nie foldery) z folderu Pobrane do folderu Wideo, użyj tego polecenia

find ~/Downloads/ -type f -print0 | xargs -0 mv -t ~/Videos

Aby przenieść tylko pliki z folderów pobierania, ale nie z podfolderów:

Jeśli chcesz przenieść wszystkie pliki z folderu Pobrane, ale żadnych plików w folderach w folderze Pobrane, użyj tego polecenia:

find ~/Downloads/ -maxdepth 1 -type f -print0 | xargs -0 mv -t ~/Videos

tutaj -maxdepthopcja określa, jak głębokie próbować powinno się znaleźć, 1oznacza to tylko katalog określony w poleceniu find. Możesz spróbować użyć 2, 3również do testowania.

Zobacz stronę podręcznika użytkownika Ubuntu, aby uzyskać szczegółowe wyjaśnienie.

Źródło

Christian Wörz
źródło
Jeśli chcę tylko skopiować wszystkie pliki do folderu, czy będę musiał zmienić mv na cp? Jestem nowy w
systemie
13

Rozwiązanie

find /src/dir -type f -exec mv --backup=numbered -t /dst/dir {} +

Polecenie znajdzie wszystkie zwykłe pliki w /src/dir(łącznie ze wszystkimi podkatalogami) i przeniesie je do pliku /dst/dirza pomocą polecenia mv. Po prostu zastąp katalogi swoim. Pliki o tych samych nazwach zostaną automatycznie zmienione.

Wybieranie plików do przeniesienia

Jeśli chcesz przenieść tylko pliki MP3, dodaj -iname "*.mp3"opcję do findpolecenia po -type f.

Porównanie z odpowiedzią c0dev

Tylko drugie polecenie w odpowiedzi c0dev odpowiada na pytanie. Poniżej znajduje się porównanie z tą odpowiedzią. Punkty 3. i 4. można rozwiązać w innej odpowiedzi w ten sam sposób, jak tutaj.

  1. Tyle mvże rozwiązanie z -exec +tym nie musi wywoływać dodatkowego polecenia, takiego jak xargslub paralleli dwukrotnie przekazywać nazwy plików.
  2. Druga odpowiedź po cichu zastąpi pliki o tej samej nazwie. Tutaj pliki zostaną automatycznie zmienione dzięki opcji --backup=numbered. Niestety te kopie zapasowe z sufiksem typu jak ~3~będą domyślnie ukryte w większości plików. Niestety mvnie pozwala na zmianę sufiksu, ale można go łatwo przetworzyć za pomocą dodatkowych poleceń. To jest rozszerzenie GNU.
  3. W przeciwieństwie do tego -print0 -exec command {} +jest częścią standardów IEEE Std 1003.1 (POSIX), ISO / IEC 9945 i pojedynczej specyfikacji UNIX. Dlatego powinien być bardziej przenośny. Patrz IEEE Std 1003.1, wydanie 2004 , IEEE Std 1003.1, wydanie 2013 i 0000243: Dodaj -print0, aby „znaleźć” . Ale w każdym razie wymagany -tprzełącznik mvto rozszerzenie GNU, więc cała komenda nie jest przenośna między systemami POSIX.

Uwaga: W przypadku findbyłby w stanie produkować ścieżki zaczynające się -(nie wiem o takiej realizacji findw tej chwili). {}Powinno być poprzedzone wskaźnika wycofanych z opcji: --.

pabouk
źródło
Błąd: znajdź: brakujący argument dla `-exec '
Chris
@Chris: Masz rację, wygląda na to, że {}musi to być ostatni argument. Poprawione
pabouk
@Chris: Czy działa teraz tak, jak chcesz? Jeśli tak, prawdopodobnie możesz zaakceptować odpowiedź, aby Twoje pytanie nie było wyświetlane jako „nierozwiązane”.
pabouk
Właśnie to uruchamiam i dostaję błędy związane
Chris
co uruchamiam: clstal @ clap: ~ $ ls 1st script.R Firefox_wallpaper.png part1vidproj zotero pdf manager Pulpit mozilla.pdf Zdjęcia Dokumenty nadrzędne filmy clstal @ clap: ~ $ find / source / directory -type f -exec mv -t / destination / directory {} + find: `/ source / directory ': Brak takiego pliku lub katalogu
Chris
2

Niestety nie mam wystarczająco wysokiej reputacji, aby komentować zaznaczone rozwiązanie. Chciałem jednak ostrzec innych przed napotkanym problemem. To dość amatorskie; jednak, gdy robisz kilka rzeczy, na początku może nie przychodzić ci to do głowy. Mam nadzieję, że pomoże innym.

Problem

Po zainicjowaniu polecenia podano warianty następującego komunikatu. Następnie polecenie tworzy wiele plików.

mv: `/data/share/docs/src/dir/filename.ext' and `/data/share/docs/src/dst/filename.ext' are the same file

Przyczyna

/srcJest dominującą /dst(EG /src/../dst/).

Rozwiązanie

Chociaż może istnieć lepsze rozwiązanie, po prostu przeniosłem pliki do katalogu tymczasowego poza moim, /srca następnie zmieniłem polecenie, aby umieścić je z powrotem w /src/../dstkatalogu, w którym chciałbym, aby skończyły.

MackAltman
źródło
2

My one-liner - działa na komputerach Mac, ale powinien również działać na każdym * nix. Zacznij od katalogu nadrzędnego.

# Move files to parent and delete empty folders
find . -not -type d -print0 | xargs -0J % mv -f % . ; find . -type d -depth -print0 | xargs -0 rm -rf

Pierwsza część przenosi wszystko ze wszystkich podfolderów do właściwego folderu, z którego patrzysz na polecenie; druga część sprawdza, czy podkatalogi są puste (powinny teraz :-) i usuwa je, aby uzyskać wszystko tutaj bez podkatalogów.

Plik X.
źródło
(1) Wyjaśnij, na czym polega twoja odpowiedź i jakie ma zalety w stosunku do innych odpowiedzi (które są bardzo podobne). Proszę nie odpowiadać w komentarzach; edytuj  swoją odpowiedź, aby była jaśniejsza i bardziej kompletna. (2) Zauważ, że -notoperator nie jest standardowy, więc twoje polecenie jest mniej przenośne niż inne.
Scott,
odnaleźć . -not -typ d -print0 | xargs -0J% mv -f%. ; odnaleźć . -type d -depth -print0 | xargs -0 rm -rf Uruchomiłem to polecenie w folderze i usunąłem podfoldery, folder, w którym byłem, a następnie przeniosłem się do folderu nadrzędnego. Na szczęście obserwowałem mojego menedżera plików i udało mi się zatrzymać polecenie, które zostało uruchomione w folderze testowym.
Czy
1

Otwórz terminal, przejdź do folderu folderów z plikami i uruchom, find . -mindepth 2 -type f -print -exec mv {} . \; aby przenieść wszystkie pliki z tych podkatalogów do bieżącego.

Lew
źródło