Also, ich habe einen kleinen dummen Fehler gemacht. Während des Datenerfassungsprozesses aus einer Quelle habe ich alles in das Stammverzeichnis meiner externen Festplatte kopiert, die jetzt über 600.000 Dateien enthält (insgesamt 23 GB). Hier sind die folgenden Optionen, die ich gerne ausführen würde:
- Verschieben Sie eine bestimmte Anzahl von Dateien von der Diskette auf meine Festplatte.
- Erstellen Sie Unterordner (mit jeweils 1.000 Dateien) und verteilen Sie die Dateien zwischen ihnen.
- Tarieren Sie das Ganze oder einen Teil davon (sagen wir 50.000 Dateien) und verschieben Sie sie auf meine Festplatte.
Aber alles, was ich versuche, scheint ewig zu dauern. Kann mir bitte jemand helfen, wie ich das am besten/effizientesten mache? Danke.
Antwort1
Im Folgenden wird ein Unterverzeichnis mit dem Namen erstellt new
und dann 50 nummerierte Unterverzeichnisse mit new
den Namen new/01
... new/50
Anschließend werden maximal 1000 Dateien aus dem aktuellen Verzeichnis in jedes dieser new/*
Verzeichnisse verschoben.
HINWEIS 1: Es funktioniert nicht, wenn einer derDateinamenhaben Zeilenumbrüche ( \n
) in sich.
HINWEIS 2: Dies erfordert GNU xargs
und GNU mv
. Sie verwenden Linux, daher sind diese Standard.
Sie können die Nummern (50 und 1000) und das Basisverzeichnis Ihren Bedürfnissen entsprechend ändern.
#! /bin/sh
BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000
mkdir -p "$BASEDIR"
for i in $(seq -w 1 "$SUBDIRS") ; do
mkdir -p "$BASEDIR/$i"
# move maximum of $FILECOUNT files to new/$i
find . -maxdepth 1 -type f | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"
done
Wenn die zu verschiebenden Dateien alle einem bestimmten Muster entsprechen, können Sie sie mit den Such- -name
oder -regex
Optionstasten auswählen. Fügen Sie die Option(en) direkt nach dem hinzu . Beispiel: Wenn Sie nur Dateien -type f
verschieben möchten :.txt
find . -maxdepth 1 -type f -name '*.txt' | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"
Eine Nicht-GNU-Version kann nicht verwenden mv -t
. Sie kann auch xargs -d
die Option nicht verwenden, aber Sie können verwenden tr '\n' '\0'
, um Zeilenumbrüche in NUL-Zeichen umzuwandeln, um sie in einzufügen xargs -0r
– dies kommt wiederum mit allen Dateien zurecht, die kein \n
im Dateinamen haben. -R -1
ist kein POSIX, eine FreeBSD-Erweiterung für xargs
. Sie können diese Option sicher entfernen, aber der mv
Vorgang wird wesentlich langsamer ausgeführt.
#! /bin/sh
BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000
mkdir -p "$BASEDIR"
for i in $(seq -w 1 "$SUBDIRS") ; do
mkdir -p "$BASEDIR/$i"
# move maximum of $FILECOUNT files to new/$i
find . -maxdepth 1 -type f | head -n "$FILECOUNT" | tr '\n' '\0' | xargs -0r -R -1 -I % mv % "$BASEDIR/$i"
done