Come spostare più file contemporaneamente in una directory di destinazione specifica?


152

Ho un sacco di file in alcune directory (insieme a molti altri file) che voglio spostare.

Fortunatamente, tutti i file che voglio spostare contengono un determinato identificatore nei loro nomi, quindi posso ls | grep IDENTIFIERottenere l'elenco esatto dei file da spostare.

Ma come posso eseguire mv file /path/to/dest/folder/contemporaneamente e non uno per uno (ci sono molti file da spostare)?

Risposte:


100

Se vuoi spostarti ABC-IDENTIFIER-XYZ.exto IDENTIFIER-XYZ.xml, puoi usare:

mv *IDENTIFIER* ~/YourPath/

*è un carattere jolly per zero o più caratteri , ciò significa zero o più caratteri , seguito da IDENTIFIER, seguito da zero o più caratteri .

Ciò sposterà tutti i file che contengono il valore IDENTIFIERspecificato.


201

Puoi usare

mv -t DESTINATION file1 file2 file3

e

mv -t DESTINATION `ls|grep IDENTIFIER`

funziona, ma non sono sicuro che mv sia invocato più volte o meno poiché grep produrrà una nuova riga per ogni corrispondenza.


5
funziona su Linux, non sono sicuro che funzionerà su Mac
Alexander Mills,

3
funziona su mac e git bash tramite git per windwows.
Brandt Solovij,

11
Non funziona su Mac (10.11.16 El Capitan). Ma puoi semplicemente mettere la cartella di destinazione sul retro, ovveromv file1 file2 ... destination
Sheljohn,

2
-1 per il secondo approccio poiché cadrà per i file che includono nuove righe
αғsнιη


24

È possibile utilizzare i caratteri jolly .

Esempio: per spostare tutti i file con estensione .doc

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

Ciò sposterà tutti i file doc nella directory corrente nella destinazione specifica.

modificare

Per rispondere al commento.

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


2
ma l'elenco dei file da spostare non è determinato dall'estensione. alcuni dei file sono chiamati: ABC-IDENTIFIER-XYZ.exte alcuni hanno IDENTIFIER-XYZ.exttutti estensioni diverse, per lo più xmlo properties.
Gilad Hoch,

@giladhoch Che ne dici di quello modificato?
Achu,

@gliadhoch Se ti senti così a tuo agio con grep, puoi vedere la mia risposta sopra / sotto.
Accendi l'

non funzionerà poiché ci sono altri .xmlfile (ad esempio) che non voglio spostare.
Gilad Hoch,

20

Nel caso in cui desideri spostare una serie di file non pertinenti (nessun modello comune nei nomi e nei tipi) puoi fare come ha detto il signor Rajanand: prima vai nella directory che contiene i file che vuoi spostare

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

Nel caso in cui i file siano sparsi in directory diverse, è sufficiente specificare il percorso per ciascun file nel comando di spostamento


10

Uso la tecnica di tuomaz, ma leggermente modificata:

mv file1 file2 file3 -t DESTINATION

Trovo questo più facile da ricordare e più difficile da rovinare poiché utilizza lo stesso ordinamento dell'operazione vanilla mv:

mv file1 DESTINATION

La pagina man di mvnon menziona -tun'opzione.
Noumenon,


7

Usa questo comando:

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

Tuttavia, ls non è raccomandato per questo tipo di utilizzo. Utilizzare invece il comando find .


8
lsnon è raccomandato per questo tipo di utilizzo. Se vuoi elencare i file, specialmente con un grepdietro, usa find . -name \*IDENTIFIER\*.
NorTicUs

Questa risposta è stata solo per dimostrare come è possibile utilizzare l'output del comando precedente in mv. Come ls | grep è stato menzionato nella domanda, l'ho appena copiato.
Accendi l'

3
Come affermato da @NorTicUs, l'uso di ls è sconsigliato. Inoltre, i file con spazi potrebbero causare un problema.
Paddy Landau,


5

Se hai così tanti file da spostare, puoi effettivamente averne troppi per il mvcomando (o altri comandi simili rm). Suggerisco di usare xargsper spostare ogni file individualmente in un ciclo come alla moda. Un modo per aggirare questo è quello di fare:

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

Il ls -1(meno uno) assicura che ci sia un solo nome di file su ogni riga. Se si hanno alias nascosti per il lscomando, è possibile avere più nomi di file su una sola riga e spostare inavvertitamente un file che non si intende spostare.


Questo è utile anche quando il tuo IDENTIFICATORE non si trasforma facilmente in un jolly o se vuoi usare grep con una regex più complessa.
AggieBill,

1
+1 per xargs. find è quasi sempre migliore e più sicuro di ls. trova . IDENTIFICATORE -exec mv {} / path / to / dest / folder \; (codice non testato). è per la directory di lavoro corrente. Il \; è terminare il comando da eseguire. A seconda di ciò che stai facendo, potresti dover aggiungere un -maxdepth 1 per evitare che ricorra in sottodirectory.
Joe,

5

Se i file si trovano nella stessa directory è possibile utilizzare

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

(testato in Ubuntu 16.04)


1
Questo non aggiunge davvero qualcosa alle risposte esistenti, non credi?
dessert

1
elimina solo la necessità di specificare il percorso completo per dir per ogni file
Sruli

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

questo comando sposta i nomi dei file con qualsiasi modello / intervallo nella directory di destinazione.

per esempio.

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

sposterà i file con nomi come file1, file2... file50000in target-directory.


2

È possibile utilizzare l'output di ls per immettere in mv commnad

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

Il comando tra $()restituisce un elenco dei nomi di file corrispondenti alla ricerca e può essere fornito come parametro per il comando mv.



1

Usando questo comando puoi spostare più file.

mv SourceFilenames ~DestinationPath


1

Il modo più semplice è così

mv {file1,file2,file3} DESTINATION

o directory

mv {directory1,directory2,directory3} DESTINATION

o sia file che directory

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

Spero che sia di aiuto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.