Jak przenosić tylko pliki w systemie Unix

18

Jak mogę przenieść tylko zwykłe pliki (nie katalogi) z jednego folderu w systemie Linux do innego folderu za pomocą mvpolecenia?

Próbowałem mv * ~/, ale skopiowałem wszystko, w tym katalogi.

Scott
źródło
twoje komentarze wspominają o dodatkowych ograniczeniach: polecenie nie powinno przenosić ukrytych plików z bieżącego katalogu roboczego. jeśli jest to poprawne, czy możesz edytować swoje pytanie, aby o tym wspomnieć? powiedzenie „przenieś tylko pliki” powoduje, że myślimy „przenieś wszystkie pliki”, w tym pliki ukryte.
quack quixote

Odpowiedzi:

29

Możesz spróbować

find . -maxdepth 1 -type f -exec mv {} destination_path \;
Mereghost
źródło
2
Wow, ktoś, kto umie używać, znajdź. Dla kompletności powinieneś użyć -name [^.] * W find, tj. --- find. -maxdepth 1 -typ f -name [^.] * -exec mv {} ścieżka \;
Chris
NIE KOPIUJ-WKLEJ TO DO SWOJEJ ŁUSKI. Średnik spowoduje jego natychmiastowe wykonanie. :)
Sherwood Callaway,
@SherwoodCallaway Średnik ma oznaczać koniec-exec
dstonek,
4

Jestem typem „używaj młotka do wszystkiego”, więc używam programów Bourne Shell do rzeczy, które inni używają programów zewnętrznych do ...

for file in * .* 
do
  test -f "$file" && mv "$file" "$HOME"/
done

Niektórzy ludzie lubią robić rzeczy tak mało pisania, jak to możliwe, ale jestem dość szybką maszynistką i mam takie rzeczy wbudowane w mój mózg, więc nie jest to zbyt uciążliwe, aby to zrobić zamiast szukać dokładnego argumenty do znalezienia i wykonania i tak dalej.

YMMV, chociaż ...

Chris
źródło
dzięki za to spróbuję. ale nadal potrzebuję innej odpowiedzi, ponieważ jest to projekt, który wykonuję na kursie linux. dzięki bardzo
1
To jest odpowiedź na twoje pytanie. mv nie rozumie plików, katalogów, fifos ani innych plików specjalnych. mv rozumie tylko wpisy katalogu i i-węzły, a jeśli chodzi o to, są one takie same, niezależnie od typu pliku. Aby mv mógł przenosić tylko określony typ pliku, potrzebujesz czegoś takiego jak test lub znajdź, który faktycznie może spojrzeć na i-węzeł, aby zobaczyć, co to jest plik. Innymi słowy, otrzymujesz podchwytliwe pytanie, jeśli zostaniesz poproszony o zrobienie tego tylko z mv.
Chris
1
I mówię, że mv rozumie i-węzły tylko dlatego, że jest w stanie przenieść plik z jednego systemu plików do innego, co technicznie jest cp, a następnie rm, a nie mv (co jest tak naprawdę tylko ln, a następnie rm). Spójrz na twarde linki i wpisy w katalogu.
Chris
2
shorty: To dobra odpowiedź, musisz użyć czegoś oprócz polecenia mv (przynajmniej powłoki). Jest to mniej więcej podstawowe bez programowania.
Kyle Brandt
3

@Mereghost jest bardzo blisko. Oto, co mogę przenieść wszystkie pliki (w tym pliki ukryte), ale nie katalogi:

find . -maxdepth 1 -type f -name '*' -exec mv -n {} /destination_path \;

.Po find zakłada, że bieżący katalog jest źródłem plików, które chcesz przenieść. Jeśli nie, polecenie można zmienić w następujący sposób:

find /source_path -maxdepth 1 -type f -name '*' -exec mv -n {} /dest_path \;

Jeśli chcesz przenieść tylko zwykłe pliki, a nie pliki ukryte:

find . -maxdepth 1 -type f -name '[!.]*' -exec mv -n {} /dest_path \;

Jeśli chcesz przenieść tylko pliki ukryte, a nie zwykłe:

find . -maxdepth 1 -type f -name '.*' -exec mv -n {} /dest_path \;
teancum144
źródło
0

Jeśli nie masz folderów z nazwą z kropką, możesz przenieść je wszystkie po prostu:

mv . ~ / folder docelowy

(Moje założenie jest takie, że wszystkie twoje pliki są czymś. Coś (w moim przypadku zazwyczaj są).

ALE dzięki innym odpowiedziom - bardzo pomocne. dzięki

Shawor
źródło
-1

możesz użyć find

find * -maxdepth 1 -type f -exec mv {} ~ \;
John T.
źródło
tak, to działało, ale nie w 100% skopiowało wszystkie pliki z katalogów i podkatalogów do ~ / location. Potrzebuję tylko czegoś bardzo podstawowego, co kopiuje pliki bez ukrytych plików z katalogu Jestem w innym katalogu. Otóż ​​to. i tak dziękuję za radę
Jest to niemożliwe przy maxdepth jako 1.
John T
naprawione, aby nie kopiowało ukrytych plików.
John T
1
Składnia przy szukaniu to znajdź potem katalog, a następnie opis operacji i rzeczy do dopasowania. Zazwyczaj nigdy nie używa się symboli wieloznacznych, takich jak find *, bez ochrony przed globowaniem (tj. Find / path / to / directory -name goo * -type f.
Chris,
1
Funkcja Znajdź działa poprawnie tylko wtedy, gdy podasz jej jedną ścieżkę do sprawdzenia. W twoim przykładzie, na przykład, jeśli jakieś pliki zaczynają się od - find, niespodziewanie wybuchnie. Zawsze lepiej jest mieć tylko jeden program, który odczytuje wpisy w katalogu, aw swoim przykładzie używasz dwóch różnych programów (find i powłoki).
Chris
-2

mv `find ./sourcedir/* -type f` ./destdir

Cm57201
źródło
2
Nie powiedzie się to dla plików zawierających spacje w nazwie. Dane wyjściowe poleceń drukujących nazwy plików nigdy nie powinny być analizowane, chyba że można zagwarantować, że są one właściwie rozdzielane. Zobacz, dlaczego nie powinieneś analizować danych wyjściowych ls (1) dla głównego pomysłu. Korzystanie find„s -execopcja jest najlepszym sposobem na uniknięcie tego problemu.
slhck,