So verschieben Sie nur Dateien in Unix


18

Wie kann ich mit dem mvBefehl nur die einfachen Dateien (nicht die Verzeichnisse) von einem Ordner in Linux in einen anderen Ordner verschieben ?

Ich habe versucht mv * ~/, aber es kopiert alles, einschließlich der Verzeichnisse.


Ihre Kommentare erwähnen eine zusätzliche Einschränkung: Der Befehl sollte keine versteckten Dateien aus dem aktuellen Arbeitsverzeichnis verschieben. Wenn dies korrekt ist, könnten Sie bitte Ihre Frage bearbeiten, um dies zu erwähnen? Wenn Sie "Nur Dateien verschieben" sagen, denken Sie "Alle Dateien verschieben", einschließlich versteckter Dateien.
Quack Quijote

Antworten:


29

Du kannst es versuchen

find . -maxdepth 1 -type f -exec mv {} destination_path \;

2
Wow, jemand, der weiß, wie man Find benutzt. Der Vollständigkeit halber solltest du -name [^.] * Im find verwenden, dh --- find. -maxdepth 1 -type f -name [^.] * -exec mv {} path \;
Chris

KOPIEREN SIE DIESE NICHT IN IHRE SCHALE. Das Semikolon bewirkt, dass es sofort ausgeführt wird. :)
Sherwood Callaway

@SherwoodCallaway Das Semikolon markiert das Ende von-exec
dstonek,

4

Ich bin ein "Benutze einen Hammer für alles" Typ, also benutze ich Bourneshell-Programme für Dinge, für die andere externe Programme verwenden ...

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

Einige Leute mögen es, Dinge so wenig wie möglich zu tippen, aber ich bin ein ziemlich schneller Typist, und ich habe solche Dinge in mein Gehirn eingebaut, so dass es nicht allzu mühsam ist, dies zu tun, anstatt genau nachzuschauen Argumente zu finden und auszuführen und all das.

YMMV, obwohl ...


danke dafür werde ich es versuchen. Aber ich brauche immer noch die andere Antwort, weil es für ein Projekt ist, das ich im Linux-Kurs mache. Vielen Dank

1
Dies ist eine Antwort auf Ihre Frage. mv versteht keine dateien oder verzeichnisse oder fifos oder andere spezielle dateien. mv versteht nur Verzeichniseinträge und Inodes, und diese sind unabhängig vom Dateityp alle gleich. Damit mv nur einen bestimmten Dateityp verschieben kann, benötigen Sie so etwas wie test oder find, mit dem Sie anhand des Inodes feststellen können, um welche Datei es sich handelt. Mit anderen Worten, Ihnen wird eine Trickfrage gestellt, wenn Sie nur mit mv dazu aufgefordert werden .
Chris

1
Und ich sage, dass mv nur Inodes versteht, weil es in der Lage ist, eine Datei von einem Dateisystem in ein anderes zu verschieben, was technisch gesehen ein cp dann ein rm ist, nicht ein mv (was wirklich nur ein ln dann rm ist). Suchen Sie nach Hardlinks und Verzeichniseinträgen.
Chris

2
shorty: Das ist eine gute Antwort, du musst etwas anderes als den Befehl mv verwenden (zumindest die Shell). Dies ist ungefähr ein grundlegendes, wie es ohne Programmierung geht.
Kyle Brandt

3

@Mereghost ist sehr nah. Hier ist, was ich bekomme, um alle Dateien (einschließlich versteckter Dateien) zu verschieben, aber keine Verzeichnisse:

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

Bei der .After-Suche wird davon ausgegangen, dass Ihr aktuelles Verzeichnis die Quelle der Dateien ist, die Sie verschieben möchten. Wenn nicht, kann der Befehl wie folgt überarbeitet werden:

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

Wenn Sie nur normale und keine versteckten Dateien verschieben möchten:

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

Wenn Sie nur versteckte und keine regulären Dateien verschieben möchten:

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

0

Wenn Sie keine Ordner mit Namen und Punkten haben, können Sie alle einfach verschieben:

mv . ~ / Zielordner

(Ich gehe davon aus, dass alle Ihre Dateien etwas sind. Etwas (in meinem Fall sind es normalerweise alle).)

ABER dank anderer Antworten - sehr hilfreich. Danke


-1

Sie können find verwenden

find * -maxdepth 1 -type f -exec mv {} ~ \;

Ja, gut, das hat funktioniert, aber nicht zu 100%. Es hat alle Dateien von Verzeichnissen und Unterverzeichnissen nach ~ / location kopiert. Ich brauche nur etwas sehr Grundlegendes, das die Dateien ohne die versteckten Dateien aus dem Verzeichnis, in dem ich mich befinde, in ein anderes Verzeichnis kopiert. das ist es. trotzdem danke für den rat

Das ist unmöglich mit maxdepth als 1.
John T

behoben, so dass versteckte Dateien nicht kopiert werden.
John T

1
Die Syntax für find lautet find, then a directory, then a description of operations und things to match. Ein Platzhalter wie find * wird normalerweise nie verwendet, ohne ihn vor dem Verschieben zu schützen (z. B. find / path / to / directory -name goo * -Typ f.
chris

1
Die Suche funktioniert nur dann ordnungsgemäß, wenn Sie einen einzelnen Pfad zur Überprüfung übergeben. Wenn in Ihrem Beispiel beispielsweise Dateien vorhanden sind, die mit a - find beginnen, wird dies unerwartet explodieren. Es ist immer viel besser, wenn nur ein Programm den Verzeichniseintrag liest, und in Ihrem Beispiel verwenden Sie zwei verschiedene Programme (find und die Shell).
Chris

-2

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


2
Dies schlägt für alle Dateien fehl, deren Name Leerzeichen enthält. Die Ausgabe von Befehlen, mit denen Dateinamen gedruckt werden, sollte niemals analysiert werden, es sei denn, es kann garantiert werden, dass eine ordnungsgemäße Begrenzung vorliegt. Siehe Warum Sie die Ausgabe von ls (1) nicht analysieren sollten, für die Hauptidee. Die Verwendung findder -execOption ist der beste Weg, um das Problem zu vermeiden.
Slhck
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.