Antworten:
Wenn Sie alles außer Verzeichnissen von $SOURCE_DIR
nach verschieben möchten $TARGET_DIR
, können Sie diesen Befehl verwenden:
find "$SOURCE_DIR" -maxdepth 1 -not -type d -exec mv -t "$TARGET_DIR" -- '{}' +
Im Detail erklärt:
find
: Die Suche nach Dateien in einem Verzeichnis suchen$SOURCE_DIR
: Das Verzeichnis, in dem gesucht werden soll-maxdepth 1
: Schauen Sie nicht in Unterverzeichnisse-not -type d
: Verzeichnisse ignorieren
-type f
wenn Sie nur Dinge kopieren möchten, bei denen es sich ausschließlich um Dateien handelt. Ich bevorzuge jedoch das Obige, da es auch alles abfängt, was weder eine Datei noch ein Verzeichnis ist (insbesondere symbolische Links).-exec mv -t "$TARGET_DIR" -- '{}' +
: Führen Sie den Befehl aus, mv -t "$TARGET_DIR" -- FILES...
in dem FILES...
sich alle übereinstimmenden Dateien befinden (danke @DavidFoerster).Ich denke, Sie möchten nur Ihre Dateien mv. Gehen Sie zuerst in Ihr Verzeichnis und verwenden Sie diesen Befehl, ersetzen Sie $ TARGET durch Ihren Zielverzeichnispfad. Wenn Sie Ihre Dateien kopieren möchten, ersetzen Sie sie mv
durch cp
.
find . -type f -exec mv {} $TARGET \;
Wenn ich dies erkläre, find . -type f
bedeutet dies, dass Sie alle Dateien auswählen und den Befehl für alle ausgewählten Elemente -exec mv {} $TARGET \;
ausführen mv
.
Die vorherige Antwort hat einen Fehler. Es werden auch mv
alle Dateien in Unterverzeichnissen angezeigt. Die schnelle Lösung ist Verwendung -maxdepth 1
. Dann werden keine rekursiven mv
Dateien in Unterverzeichnissen gespeichert. Unten ist die richtige ..
find . -maxdepth 1 -type f -exec mv {} $TARGET \;
-type f
verhindert keine Rekursion.
Wenn Sie rekursiv mit Dateien umgehen, find
ist dies der richtige Weg. In diesem speziellen Fall ist es nicht notwendig, kann aber verwendet werden, -maxdepth 1
wie andere Antworten zeigen.
Ein einfacher Python-Befehl kann dies ebenfalls tun. Hier ist ein Beispiel:
$ tree
.
├── a_directory
└── a_file
$ python -c "import os,shutil;fl=[f for f in os.listdir('.') if os.path.isfile(f)];
> map(lambda x:shutil.move(x,'./a_directory'),fl)"
$ tree
.
└── a_directory
└── a_file
1 directory, 1 file
fl=[f for f in os.listdir('.') if os.path.isfile(f)]
iteriert über alle gefundenen Elemente os.listdir('.')
und wir testen mithilfe der os.path.isfile()
Funktion, ob es sich bei dem Element um eine Datei handelt .
Sobald die fl
Dateiliste erstellt ist, verwenden wir die map()
Funktion. Diese Funktion akzeptiert zwei Argumente - eine Funktion und eine Liste von Elementen. Es wird die Funktion ausführen, die wir für jede Datei in einer Liste angegeben haben. Wir haben hier also lambda x:shutil.move(x,'./a_directory')
eine anonyme Funktion, die eine bestimmte Datei in ein bestimmtes Verzeichnis verschiebt, und dann haben wir fl
die Liste der Dateien, die wir erstellt haben.
Aus Gründen der Lesbarkeit und allgemeinen Verwendung können wir dies auch als allgemeines Python-Skript umschreiben, das zwei Argumente verwendet - Quellverzeichnis und Ziel-Unterverzeichnis.
#!/usr/bin/env python3
from os import listdir
from os.path import isfile,realpath
from os.path import join as joinpath
from shutil import move
from sys import argv
# this is script's full path
script=realpath(__file__)
# get all items in a given directory as list of full paths
fl=[ joinpath(argv[1],f) for f in listdir(argv[1]) ]
# filter out script itself ( just in case) and directories
fl_filtered = [ f for f in fl if isfile(f) and not script == realpath(f) ]
# Uncomment this in case you want to see the list of files to be moved
# print(fl_filtered)
# move the list of files to the given destination
for i in fl_filtered:
move(i,argv[2])
Und die Verwendung ist wie folgt:
$ tree
.
├── a_directory
├── a_file
└── files2subdir.py
1 directory, 2 files
# Notice: the script produces no output unless you uncomment print statement
$ ./files2subdir.py "." "./a_directory"
$ tree
.
├── a_directory
│ └── a_file
└── files2subdir.py
Wenn Sie zsh anstelle von bash verwenden, können Sie Folgendes tun:
mv "$SOURCE"/*(.) "$TARGET"
Das (.)
am Ende wird als Glob-Qualifier bezeichnet. Das .
Innere bedeutet speziell, nur reguläre Dateien abzugleichen.
Ein zu machen mv *(.) "$target"
ist schnell und praktisch. Wenn Sie dies jedoch als Teil eines Skripts tun, sollten Sie stattdessen etwas schreiben, wie es Frxstrem und David Forester vorgeschlagen haben mv -t "$target" -- *(.)
, um Eckfälle besser zu behandeln, die bei der Verwendung durch andere Personen auftreten können.
mv -t "$TARGET" -- "$SOURCE"/*(.)
wäre dies sicherer (falls "$TARGET"
mit -
einem Verzeichnis begonnen wird oder nicht). Ich mag die zsh-Lösung!
So verschieben Sie in Python alles außer Verzeichnissen von source-dir
Verzeichnis zu destination-dir
Verzeichnis:
#!/usr/bin/env python3
"""Usage: mv-files <source-dir> <destination-dir>"""
import shutil
import sys
from pathlib import Path
if len(sys.argv) != 3:
sys.exit(__doc__) # print usage & exit 1
src_dir, dest_dir = map(Path, sys.argv[1:])
for path in src_dir.iterdir():
if not path.is_dir():
shutil.move(str(path), str(dest_dir / path.name))
import mypackage
vorfrom mypackage import ...
from __future__
Importe und gewöhnlichen from pathlib
Importe.
import module
sollte der erste sein ( from module import object
Ich würde verwenden
mv *.*
Dies funktioniert, solange Ihre Ordner keine Erweiterungen haben.
find ... -exec mv -t "$TARGET_DIR" -- '{}' +
wäre sicherer (falls$TARGET_DIR
kein Verzeichnis vorhanden ist oder die Übereinstimmung mit beginnt-
) und effizienter (da nicht für jede übereinstimmende Datei ein neuer Unterprozess erzeugt wird).