Jak przenieść wiele plików jednocześnie do określonego katalogu docelowego?


152

Mam kilka plików w pewnym katalogu (wraz z wieloma innymi plikami), które chcę przenieść.

Na szczęście wszystkie pliki, które chcę przenieść, zawierają w swoich nazwach określony identyfikator, dzięki czemu mogę ls | grep IDENTIFIERuzyskać dokładną listę plików do przeniesienia.

Ale jak mogę wykonać mv file /path/to/dest/folder/od razu, a nie jeden po drugim (jest wiele plików do przeniesienia)?

Odpowiedzi:


100

Jeśli chcesz się przenieść ABC-IDENTIFIER-XYZ.extlub IDENTIFIER-XYZ.xmlmożesz użyć:

mv *IDENTIFIER* ~/YourPath/

*jest symbolem wieloznacznym dla zera lub więcej znaków , oznacza to zero lub więcej znaków , po których IDENTIFIERnastępuje, a następnie zero lub więcej znaków .

Spowoduje to przeniesienie wszystkich plików, które zawierająIDENTIFIER określone przez Ciebie.


201

Możesz użyć

mv -t DESTINATION file1 file2 file3

i

mv -t DESTINATION `ls|grep IDENTIFIER`

działa, ale nie jestem pewien, czy mv jest wywoływany wiele razy, czy nie, ponieważ grep wyświetli nową linię dla każdego dopasowania.


5
działa na systemie Linux, nie jestem pewien, czy będzie działał na Macu
Alexander Mills

3
działa na Mac i Git Bash przez git dla okien.
Brandt Solovij

11
Nie działa na Macu (10.11.16 El Capitan). Ale możesz po prostu umieścić folder docelowy z tyłu, tj.mv file1 file2 ... destination
Sheljohn,

2
-1 dla drugiego podejścia, ponieważ spadnie dla plików zawierających nowe linie
αғsнιη


24

Możesz używać symboli wieloznacznych .

Przykład: Aby przenieść wszystkie pliki o rozszerzeniu .doc

mv *.doc /path/to/dest/folder/

Spowoduje to przeniesienie całego pliku doc ​​w bieżącym katalogu do określonego miejsca docelowego.

Edytować

Aby odpowiedzieć na komentarz.

mv *.ext *.xml *.txt /path/to/dest/folder/


2
ale lista plików do przeniesienia nie jest określona przez rozszerzenie. niektóre pliki mają nazwy: ABC-IDENTIFIER-XYZ.exta niektóre po prostu IDENTIFIER-XYZ.extmają różne rozszerzenia, głównie xmllub properties.
gilad hoch

@ giladhoch A co z edytowanym?
Achu,

@gliadhoch Jeśli czujesz się komfortowo używając grep, możesz zobaczyć moją odpowiedź powyżej / poniżej.
rozpalić

nie będzie działać, ponieważ istnieją inne .xmlpliki (na przykład), których nie chcę przenosić.
gilad hoch

20

Jeśli chcesz przenieść zestaw nieistotnych plików (brak wspólnego wzorca w nazwach i typach), możesz zrobić tak, jak powiedział pan Rajanand: najpierw przejdź do katalogu zawierającego pliki, które chcesz przenieść

mv file1.ext1 file2.ext2 file3.ext3.. /destination/

W przypadku, gdy pliki są rozproszone w różnych katalogach, wystarczy podać ścieżkę do każdego pliku w poleceniu move


10

Używam techniki tuomaz, ale nieco zmodyfikowanej:

mv file1 file2 file3 -t DESTINATION

Uważam, że jest to łatwiejsze do zapamiętania i trudniejsze do zepsucia, ponieważ używa tego samego porządku co operacja waniliowa mv:

mv file1 DESTINATION

Strona podręcznika dla mvnie wspomina o żadnej -topcji.
Noumenon


7

Użyj tego polecenia:

mv `ls|grep IDENTIFIER` /path/to/dest/folder  

Jednak ls nie jest zalecany do tego rodzaju zastosowań. Zamiast tego użyj polecenia find .


8
lsnie jest zalecany do tego rodzaju użytkowania. Jeśli chcesz wyświetlić listę plików, zwłaszcza z greptyłu, użyj find . -name \*IDENTIFIER\*.
NorTicUs,

Ta odpowiedź miała jedynie pokazać, w jaki sposób można użyć danych wyjściowych poprzedniego polecenia w mv. Jak wspomniano w ls | grep, właśnie go skopiowałem.
rozpalić

3
Jak stwierdził @NorTicUs, użycie ls nie jest zalecane. Również pliki ze spacjami mogą powodować problem.
Paddy Landau


5

Jeśli masz tyle plików do przeniesienia, możesz mieć ich zbyt wiele dla mvpolecenia (lub innych poleceń, takich jak rm). Sugeruję użycie, xargsaby przenieść każdy plik osobno w pętli jak w modzie. Jednym ze sposobów obejścia tego jest:

ls -1 | grep IDENTIFIER | xargs -i mv {} /path/to/dest/folder/

ls -1(Minus jeden) zapewnia, że istnieje tylko jedna nazwa pliku na każdej linii. Jeśli masz ukryte aliasy dla lspolecenia, możesz mieć wiele nazw plików w jednym wierszu i przypadkowo przenieść plik, którego nie zamierzałeś przenieść.


Jest to również przydatne, gdy IDENTYFIKATOR nie daje się łatwo zamienić na symbol wieloznaczny lub chcesz użyć grep z bardziej złożonym wyrażeniem regularnym.
AggieBill,

1
+1 dla xargs. find jest prawie zawsze lepszy i bezpieczniejszy niż ls. odnaleźć . IDENTYFIKATOR -exec mv {} / path / to / dest / folder \; (nieprzetestowany kod). dotyczy bieżącego katalogu roboczego. \; ma zakończyć polecenie, które ma zostać wykonane. W zależności od tego, co robisz, konieczne może być dodanie parametru -maxdepth 1, aby uniemożliwić rekurencję w podkatalogach.
Joe

5

Jeśli pliki znajdują się w tym samym katalogu, możesz użyć

mv /path/to/source/dir/{file1,file2,*.ext1,*.ext2} /path/to/destination/

(testowany w Ubuntu 16.04)


1
To tak naprawdę nie dodaje czegoś do istniejących odpowiedzi, nie sądzisz?
deser

1
po prostu eliminuje potrzebę podawania pełnej ścieżki do katalogu dla każdego pliku
Sruli

3
find -type f -name "[range]" -exec mv {} target-directory ';'

to polecenie przenosi nazwy plików o dowolnym wzorze / zakresie do katalogu docelowego.

na przykład.

find -type f -name "file[1-50000]" -exec mv {} target-directory ';'

będzie przenieść pliki o nazwach takich jak file1, file2... file50000do target-directory.


2

Możesz użyć wyjścia z ls do wprowadzenia do komendy mv commnad

mv $(ls | grep IDENTIFIER) /path/to/dest/dir

Komenda między $()zwraca listę nazw plików pasujących do wyszukiwania, które można podać jako parametr dla komendy mv.



1

Za pomocą tego polecenia możesz przenosić wiele plików.

mv SourceFilenames ~DestinationPath


1

Najłatwiej jest to zrobić

mv {file1,file2,file3} DESTINATION

lub katalog

mv {directory1,directory2,directory3} DESTINATION

lub zarówno pliki, jak i katalogi

mv {file1,file2,file3,directory1,directory2,directory3} DESTINATION

Mam nadzieję że to pomoże

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.