Wie verschiebe ich mehrere Dateien gleichzeitig in ein bestimmtes Zielverzeichnis?

152

Ich habe eine Reihe von Dateien in einem Verzeichnis (zusammen mit vielen anderen Dateien), die ich verschieben möchte.

Glücklicherweise enthalten alle Dateien, die ich verschieben möchte, einen bestimmten Bezeichner in ihren Namen, sodass ich ls | grep IDENTIFIERdie genaue Liste der zu verschiebenden Dateien abrufen kann.

Aber wie kann ich mv file /path/to/dest/folder/sofort und nicht nacheinander ausführen (es müssen viele Dateien verschoben werden)?

Gilad hoch
quelle

Antworten:

100

Wenn Sie sich ABC-IDENTIFIER-XYZ.extoder bewegen möchten IDENTIFIER-XYZ.xml, können Sie Folgendes verwenden:

mv *IDENTIFIER* ~/YourPath/

*ist ein Platzhalter für null oder mehr Zeichen , bedeutet dies , null oder mehr Zeichen , gefolgt von IDENTIFIER, gefolgt von null oder mehr Zeichen .

Dadurch werden alle Dateien verschoben, die die von IDENTIFIERIhnen angegebenen enthalten.

Evandro Silva
quelle
201

Du könntest benutzen

mv -t DESTINATION file1 file2 file3

und

mv -t DESTINATION `ls|grep IDENTIFIER`

funktioniert, aber ich bin nicht sicher, ob mv mehrmals aufgerufen wird oder nicht, da grep für jede Übereinstimmung eine neue Zeile ausgibt.

Tuomaz
quelle
5
Funktioniert unter Linux, nicht sicher, ob es unter Mac funktioniert
Alexander Mills
3
Funktioniert auf Mac und Git Bash via Git für Windows.
Brandt Solovij
11
Funktioniert nicht auf Mac (10.11.16 El Capitan). Sie können den mv file1 file2 ... destination
Zielordner
2
-1 für den zweiten Ansatz, da es für Dateien mit neuen Zeilen fallen wird
αғsнιη
24

Sie können Platzhalter verwenden .

Beispiel: Verschieben aller Dateien mit der Erweiterung .doc

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

Dadurch werden alle doc-Dateien im aktuellen Verzeichnis an das angegebene Ziel verschoben.

Bearbeiten

Um den Kommentar zu beantworten.

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

Achu
quelle
2
Die Liste der zu verschiebenden Dateien wird jedoch nicht durch die Erweiterung bestimmt. Einige der Dateien heißen: ABC-IDENTIFIER-XYZ.extund IDENTIFIER-XYZ.extandere haben meistens xmloder alle unterschiedliche Erweiterungen properties.
Gilad Hoch
@ Giladhoch Wie wäre es mit dem bearbeiteten?
Achu
@gliadhoch Wenn du so gut mit grep umgehen kannst, siehst du meine Antwort oben / unten.
zünden
funktioniert nicht, da es andere .xmlDateien gibt (zum Beispiel), die ich nicht verschieben möchte.
Gilad Hoch
20

Wenn Sie eine Reihe irrelevanter Dateien verschieben möchten (kein gemeinsames Muster in den Namen und Typen), können Sie wie von Herrn Rajanand angegeben vorgehen: Gehen Sie zunächst in das Verzeichnis, in dem sich die zu verschiebenden Dateien befinden

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

Falls sich die Dateien in verschiedenen Verzeichnissen befinden, müssen Sie nur den Pfad für jede Datei im Befehl move angeben

Ismail AL-Taharwa
quelle
10

Ich benutze Tuomaz Technik, aber leicht modifiziert:

mv file1 file2 file3 -t DESTINATION

Ich finde das leichter zu merken und schwieriger zu vermasseln, da es die gleiche Reihenfolge wie die Vanille-MV-Operation verwendet:

mv file1 DESTINATION
Blake Frederick
quelle
Die Manpage für mverwähnt keine -tOption.
Noumenon
2
linux.die.net/man/1/mv yes it does
geoyws
7

Verwenden Sie diesen Befehl:

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

Ls wird jedoch für diese Art der Verwendung nicht empfohlen. Verwenden Sie stattdessen den Befehl find .

entzünden
quelle
8
lswird für diese Verwendung nicht empfohlen. Wenn Sie Dateien auflisten möchten, insbesondere mit einem grepBehind, verwenden Sie find . -name \*IDENTIFIER\*.
NorTicUs
Diese Antwort sollte nur zeigen, wie Sie die Ausgabe des vorherigen Befehls in mv verwenden können. Da ls | grep in der Frage erwähnt wurde, habe ich es einfach kopiert.
zünden
3
Wie von @NorTicUs angegeben, wird die Verwendung von ls nicht empfohlen. Dateien mit Leerzeichen können ebenfalls ein Problem verursachen.
Paddy Landau
5

Wenn Sie so viele Dateien verschieben müssen, können Sie tatsächlich zu viele für den mvBefehl (oder andere Befehle wie rm) haben. Ich schlage xargsvor, jede Datei einzeln in einer Schleife zu verschieben. Eine Möglichkeit, dies zu umgehen, besteht darin, Folgendes zu tun:

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

Das ls -1(minus eins) stellt sicher, dass in jeder Zeile nur ein Dateiname steht. Wenn Sie Aliase für den lsBefehl ausgeblendet haben, können Sie mehrere Dateinamen in einer einzelnen Zeile haben und versehentlich eine Datei verschieben, die Sie nicht verschieben wollten.

AggieBill
quelle
Dies ist auch nützlich, wenn Ihr IDENTIFIER nicht einfach in ein Platzhalterzeichen umgewandelt werden kann oder Sie grep mit einem komplexeren regulären Ausdruck verwenden möchten.
AggieBill
1
+1 für xargs. find ist fast immer besser und sicherer als ls. finden . IDENTIFIER -exec mv {} / Pfad / zu / Ziel / Ordner \; (ungetesteter Code) Die. ist für das aktuelle Arbeitsverzeichnis. Das \; Beendet den auszuführenden Befehl. Je nachdem, was Sie gerade tun, müssen Sie möglicherweise eine -maxdepth 1 hinzufügen, damit sie nicht in Unterverzeichnisse rekursiv wird.
Joe
5

Wenn sich die Dateien in demselben Verzeichnis befinden, können Sie sie verwenden

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

(getestet in Ubuntu 16.04)

Sruli
quelle
1
Das fügt den vorhandenen Antworten nicht wirklich etwas hinzu, meinst du nicht auch?
Dessert
1
macht es einfach
überflüssig,
3
find -type f -name "[range]" -exec mv {} target-directory ';'

Dieser Befehl verschiebt Dateinamen mit einem beliebigen Muster / Bereich in das Zielverzeichnis.

z.B.

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

es werden die Dateien mit Namen bewegen sich wie file1, file2... file50000zu target-directory.

user734124
quelle
2

Sie können die Ausgabe von ls zur Eingabe in mv commnad verwenden

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

Der Befehl between $()gibt eine Liste der Dateinamen zurück, die Ihrer Suche entsprechen, und die als Parameter für den Befehl mv angegeben werden kann.

Fuad Saud
quelle
1
Nicht parsenls
Zanna
1

Mit diesem Befehl können Sie mehrere Dateien verschieben.

mv SourceFilenames ~DestinationPath

Rajanand
quelle
1

Der einfachste Weg ist so

mv {file1,file2,file3} DESTINATION

oder Verzeichnis

mv {directory1,directory2,directory3} DESTINATION

oder sowohl Dateien als auch Verzeichnisse

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

Hoffe das hilft

Sabrina
quelle