Wie kopiere/tarne ich Dateien aus einem Ordner mit einer großen Anzahl von Dateien?

Wie kopiere/tarne ich Dateien aus einem Ordner mit einer großen Anzahl von Dateien?

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:

  1. Verschieben Sie eine bestimmte Anzahl von Dateien von der Diskette auf meine Festplatte.
  2. Erstellen Sie Unterordner (mit jeweils 1.000 Dateien) und verteilen Sie die Dateien zwischen ihnen.
  3. 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 newund dann 50 nummerierte Unterverzeichnisse mit newden Namen new/01... new/50Anschließ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 xargsund 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- -nameoder -regexOptionstasten auswählen. Fügen Sie die Option(en) direkt nach dem hinzu . Beispiel: Wenn Sie nur Dateien -type fverschieben 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 -ddie 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 \nim Dateinamen haben. -R -1ist kein POSIX, eine FreeBSD-Erweiterung für xargs. Sie können diese Option sicher entfernen, aber der mvVorgang 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

verwandte Informationen