Lesen Sie die Dateien im Verzeichnis und gruppieren Sie sie in einem neuen Unterverzeichnis (Erstellen des Unterverzeichnisses und Umbenennen der Datei).

434
Zuul

Ich habe eine Wiederherstellung für alte gelöschte Dateien durchgeführt! Der Prozess war ein voller Erfolg und stellte Dateien von vor Jahren wieder her.

Das Problem besteht nun darin, alle 400000 wiederhergestellten Dateien des Typs JPG allein durchzugehen.

Um dies zu umgehen, habe ich die Dateien bereits nach ihrer Größe getrennt und die Dateien, die den Kriterien entsprechen, in einem anderen Verzeichnis gespeichert:

find /path/to/files/ -size +100k -print0 | xargs -0 cp --target-directory=/path/to/filtered/files/ 

Da die Dateien aus der Ferne analysiert werden sollen, habe ich eine Webseite erstellt, auf der alle Dateien angezeigt werden, damit sie lokal gespeichert werden können. Diese Webseite zeigt die Dateien 20 gleichzeitig mit Navigationspfeilen!


Meine Frage ist, wie die 400000-Dateien in Unterverzeichnisse mit jeweils 20 Dateien aufgeteilt und die Dateien nacheinander umbenannt werden:

Umbenennen in

000001.jpg 000002.jpg ... 000020.jpg 

Wechseln Sie in ein Unterverzeichnis, indem Sie das Unterverzeichnis erstellen

page_0001 

Wiederholen, bis alle 400000 abgearbeitet sind!

page_0002/000021.jpg page_0002/000022.jpg ... page_0002/000040.jpg 
4
… Nach und nach umbenannt? Ihre Änderungszeit? Ihre alphanumerische Sortierreihenfolge? slhck vor 12 Jahren 0
@slhck, keine besondere Spezifikation für die Umbenennung, indem der Datei, die mit späteren Verarbeitungsproblemen in Verbindung steht, nur ein "anständiger" Name gegeben wird, also im Grunde umbenannt, wenn sie gelesen werden! Zuul vor 12 Jahren 0
Warum müssen Sie sie in Unterverzeichnissen haben? Daniel Andersson vor 12 Jahren 0

2 Antworten auf die Frage

2
Octávio Filipe Gonçalves

Ich habe das gleiche Problem. Ich schreibe diesen Code in BASH und arbeitete für mich.

Ändern Sie mit Ihren Bedürfnissen:

#/bin/bash  target_prefix=page  SOURCE_DIR=YOUR_DIR #Change this to source dir  N=0 Z=0  for entry in $SOURCE_DIR/* do N=$((N+1)) Z=$((Z+1))  if [ "$N" == "1" ]; then mkdir $SOURCE_DIR/$target_prefix-$Z DIR="$SOURCE_DIR/$target_prefix-$Z" fi  echo "Move image $entry number $N to dir $DIR"  mv $entry $DIR/$Z.jpg #Change to your file extension  if [ "$N" == "20" ]; then N=0 fi done 

Hoffe diese Arbeit.

Ich werde es versuchen und werde mich bald bei Ihnen melden! Zuul vor 12 Jahren 0
Tks, hat die Arbeit ziemlich gut gemacht! Ich habe die Leihgabe von Nullen nicht angesprochen, aber ich kann mich später damit befassen! Tks wieder. Zuul vor 12 Jahren 0
0
Alex Chamberlain

Das folgende Bash-Skript sollte den Trick ausführen, jedoch keine Garantien.

i=1 for f in * do fn=$(printf "%.6d" $i).jpg dn=page_$(printf "%.4d" $(($i%20))) mkdir -p $dn cp $f "$dn/$fn" i=$(($i+1)) done 
Ich probiere es aus und gebe dir Feedback! Zuul vor 12 Jahren 0
`for f in *` funktioniert möglicherweise nicht mit 400000 (!) Dateien. Das sind einfach zu viele Argumente. Betrachten Sie eine Schleife über `find. -print0` Ergebnisse werden in `while read -d '' -r Datei` oder ähnliches piping. slhck vor 12 Jahren 0
Die Klammern wurden korrigiert. Ich habe nicht versucht, das auszuführen, da ich keine passenden Dateien hatte. Alex Chamberlain vor 12 Jahren 0
Ich habe es versucht, aber es wurde ein nicht spezifizierter Fehler ausgegeben ... Ich kann nicht wirklich sagen, was der Fehler war :( Zuul vor 12 Jahren 0