So verschieben Sie Stapel von 20 Dateien rekursiv aus einem Ordner mit 1000 Dateien in nummerierte Ordner

So verschieben Sie Stapel von 20 Dateien rekursiv aus einem Ordner mit 1000 Dateien in nummerierte Ordner

Ich habe einen Ordner mit 1000 (oder mehr) Dateien. Ich möchte ein Skript, das einen nummerierten Ordner erstellt und dann die ersten 20 Dateien (nach Namen sortiert) in diesen Ordner verschiebt. Dies sollte es dann für die anderen Dateien tun und die Ordnernummer um 1 erhöhen, bis sich alle Dateien in Ordnern befinden.

Ich habe den folgenden Befehl ausprobiert, aber er erstellt nicht automatisch ein ganzes Verzeichnis und erhöht die Ordnernummer nicht automatisch:

N=1000;
for i in ${srcdir}/*; do
  [ $((N--)) = 0 ] && break
  cp -t "${dstdir}" -- "$i"
done

Wie kann dies mit Bash gemacht werden?

Antwort1

Dieses Skript verwendet zwei (optionale) Argumente: das zu partitionierende Verzeichnis und die Partitionsgröße. Da Sie nicht gesagt haben, ob Sie nur Dateien oder alles verschieben möchten, nahm ich an, dass Sie Dateien meinten, und verwendete daher den Befehl „find“.

Ein paar Kommentare,

  • Wenn Sie keine Shell angegeben hätten, wäre so etwas einfacher in Perl, Ruby oder Python zu erledigen.
  • find mit maxdepth 1 führt nur das Verzeichnis aus
  • Sie können die Dateien überallhin verschieben, ändern Sie einfach den Ordnernamen
  • Da find verwendet wird, können Sie -name, -mtime, -ctime usw. hinzufügen.

Kopieresome.sh,

#!/bin/bash
path=${1:-"."} #directory to start
howmany=${2:-20} #partition size
pushd $path; #move there
part=1; #starting partition
LIST="/usr/bin/find -maxdepth 1 -type f" #move only files?
#LIST="ls" #move everything #be careful, $folder will get moved also :-)
count=`$LIST |/usr/bin/wc -l`; #count of files to move
while [ $count -gt 0 ]; do
    folder="folder-$part";
    if [ ! -d $folder ]; then /usr/bin/mkdir -p $folder; fi
    /usr/bin/mv `$LIST |/usr/bin/sort |/usr/bin/head -$howmany` $folder/.
    count=`$LIST |/usr/bin/wc -l`; #are there more files?
    part=$(expr $part + 1)
done
popd $path

Hier ist ein Skript zum Testen (ich hatte nicht 1000 zusätzliche Dateien herumliegen):

for f in 0 1 2 3 4 5 6 7 8 9; do
  for g in 0 1 2 3 4 5 6 7 8 9; do
    for h in 0 1 2 3 4 5 6 7 8 9; do
        touch $f$g$h
    done
  done
done

Antwort2

Wenn Ihr Dateiname mit entsprechenden Zahlen endet, die Shell jedoch . ist, sollte nur eine forSchleife ausreichen.zsh

for N in {0..800..20}: do
    mkdir "dir$N"
    mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done

Wenn es in ist bash, dann:

for N in {0..800..20}: do
    mkdir "dir$N"
    eval mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done

Lernbeitrag:Wie kann ich $variable in einer Shell-Klammernerweiterung einer Sequenz verwenden?

verwandte Informationen