So verschieben Sie nur Dateien in Unix

26484
Scott

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 es versucht mv * ~/, aber es kopierte alles inklusive der Verzeichnisse.

16
your comments mention an additional restriction: the command shouldn't move hidden files from the current working directory. if this is correct, could you please edit your question to mention this? saying "move only files" makes us think "move all the files", which includes hidden files. quack quixote vor 15 Jahren 0

5 Antworten auf die Frage

24
Mereghost

Du kannst es versuchen

find . -maxdepth 1 -type f -exec mv {} destination_path \; 
Wow, wer weiß, wie man ihn findet. Der Vollständigkeit halber sollten Sie -name [^.] \ * In find verwenden, dh --- find. -maxdepth 1-type f -name [^.] \ * -exec mv {} pfad \; chris vor 15 Jahren 2
5
chris

Ich bin ein Hammer für alles, also benutze ich Bourne-Shell-Programme für Dinge, die andere für 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 erledigen, aber ich bin eine ziemlich schnelle Schreibkraft, und ich habe solche Sachen in mein Gehirn eingebaut, so dass es nicht zu schmerzhaft ist, dies zu tun, anstatt genau nachzuschauen Argumente zu finden und exec und all das.

YMMV, obwohl ...

thanks for that i will try it. but i still need the other answer because its for a project i am doing in linux course. thanks alot vor 15 Jahren 0
This *is* an answer to your question. mv has no understanding of files or directories or fifos or other special files. mv only understands directory entries and inodes, and as far as it is concerned, those are all the same regardless of file type. To allow mv to only move a specific type of file, you need something like test or find that can actually look at the inode to see what the file is. In other words, you're being asked a trick question if you are being asked to do it *only* with mv. chris vor 15 Jahren 1
And I say that mv understands inodes *only* because it is able to move a file from one filesystem to another, which is technically a cp then an rm, not an mv (which is really just a ln then rm). Look hardlinks and directory entries. chris vor 15 Jahren 1
shorty: This is a good answer, you have to using something besides the mv command (at least the shell). This is about a basic as it gets without programming. Kyle Brandt vor 15 Jahren 2
2
teancum144

@Mereghost ist sehr nahe. Folgendes bekomme ich, um alle Dateien (einschließlich versteckter Dateien) zu verschieben, jedoch keine Verzeichnisse:

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

Das .after find nimmt an, dass das aktuelle 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 reguläre Dateien und keine versteckten Dateien verschieben möchten:

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

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

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

Sie können find verwenden

find * -maxdepth 1 -type f -exec mv {} ~ \; 
yeah well that worked but not 100% it copied all the files from directories and sub directories to ~/ location. i need just something very basic that copies the files without the hidden files from the dir i am in to another dir. thats it. thanks for the advice anyway vor 15 Jahren 0
Das ist mit maxdepth als 1 unmöglich. John T vor 15 Jahren 0
behoben, damit keine versteckten Dateien kopiert werden. John T vor 15 Jahren 0
Die Syntax bei find ist find, dann ein Verzeichnis, dann eine Beschreibung der Operationen und der dazugehörigen Dinge. Normalerweise würde man niemals einen Platzhalter wie find * verwenden, ohne ihn vor dem Globbing zu schützen (z. B. find / path / to / directory -name goo \ * -type f.). chris vor 15 Jahren 1
das ist, was es tun soll. Es erfasst alle Dateien außer den versteckten Dateien. John T vor 15 Jahren 0
Suchen funktioniert nur dann ordnungsgemäß, wenn Sie einen einzelnen Pfad zur Prüfung übergeben. Wenn in Ihrem Beispiel Dateien vorhanden sind, die mit - 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 vor 15 Jahren 1
-2
Cm57201

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

Dies schlägt für alle Dateien fehl, deren Namen Leerzeichen enthalten. Die Ausgabe von Befehlen, die Dateinamen drucken, sollte niemals analysiert werden, es sei denn, es kann sichergestellt werden, dass sie richtig abgegrenzt ist. Siehe [Warum Sie die Ausgabe von ls (1) nicht analysieren sollten] (http://mywiki.wooledge.org/ParsingLs) zur Hauptidee. Verwenden Sie die `-exec`-Option von find, um das Problem zu vermeiden. slhck vor 11 Jahren 2