2017-12-21 2 views
1

Ich habe ein Verzeichnis von mehr als einer Million Bilder, kategorisiert nach dem Ort, an dem das Bild aufgenommen wurde. Nun sind diese Orte wieder alphabetisch in Ordner sortiert. Zum BeispielWie kann ich eine Reihe von sequenziell benannten Dateien aus mehreren Ordnern in einen anderen Ordner kopieren?

--- Images 
     |____ a 
     |  |___ airfield 
     |  |___ alley 
     | 
     |____ b 
       |___ bank 
         |__ bank-00001.jpg 
         |__ bank-00002.jpg 
          . 
          . 
          . 

Wie kann ich kopieren Sie die ersten 100 Dateien von jedem Ort Unterverzeichnis wie Flugplatz, gasse, Bank usw. in einem anderen Ordner?

Ich habe versucht:

find /Source/Directory/path -type f -print | tail -100 | xargs -J % cp % /Destination/Diretory/path 

aber ich vermute es die Bilder überschrieben, da nur die letzten 100 Bilder des letzten Unterordner kopiert wurden.

Meine bash Version

GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16) 
Copyright (C) 2007 Free Software Foundation, Inc. 
+0

es relevant ist zu erwähnen, welche Version von bash sind Sie laufen, 'bash -version' –

+0

die Frage Vielleicht Edited Fügen Sie die Bash-Version hinzu. –

Antwort

0

Vorausgesetzt, dass Sie sie alle auf das gleiche Ziel wollen und alle Dateien so, wie Sie es genannt vertreten haben:

   ... 
        |__ bank-00001.jpg 
        |__ bank-00002.jpg 

Sie das Problem, indem Sie vereinfachen dies:

Für Versionen von Bash gleich oder höher 4.0:

for i in {00000001...00000100}; do 
    find /path/to/Images -maxdepth 3 -mindepth 1 -type f -name "*_$i.jpg" -exec cp {} /destination/path \; 
done 

Auf diese Weise kopieren Sie alle ersten 100 Bilder in jedem Unter-Unterordner, basierend auf ihrem Namen.

Für bash-Versionen vor 4.0:

for i in $(seq -f '%08g' 1 100) 
do 
    find /path/to/Images -maxdepth 3 -mindepth 1 -type f -name "*_$i.jpg" -exec cp {} /destination/path \; 
done 

How to zero pad a sequence of integers in bash so that all have the same width?

+0

Entschuldigung, die Bilder heißen "airfield_00000001.jpg", "airfield_00000002.jpg" und so weiter. Ich habe das Skript, das Sie zur Verfügung gestellt haben, modifiziert, um das widerzuspiegeln, aber ich muss irgendwo einen Fehler gemacht haben, da das Skript eine Zeit lang ausgeführt wird, aber die Dateien nicht kopiert werden. Das modifizierte Skript ist 'für i in {001 ... 100}; Do find/Benutzer/Ynapolean/Desktop/data_256 -maxdepth 3 -mindepth 1 -type f -name "* _00000 $ i.jpg" -exec cp {}/Benutzer/Ynapolean/Desktop/MITdata \; done' –

+0

Vielen Dank für die schnelle Antwort. Ich habe das aktualisierte Skript verwendet, ich habe immer noch das gleiche Problem. Das Skript wird ausgeführt, kopiert die Dateien jedoch nicht in das neue Verzeichnis. –

+0

Das hat den Trick, danke :) –

0

Können Sie so etwas wie dies versuchen:

#!/bin/bash 
for files in $(find . -type f | sed -r 's/(.*\/).*$/\1/g' | uniq); 
do 
    find ${files} -type f | head -n100 | tr '\n' '\0' | xargs -0 cp /path/where/to/copy; 
done 

Ich bin nicht sicher, ob es haben ist richtig kein Linux, -terminal in der Nähe. Die Logik ist: 1) Finden Sie uniq vollständige Pfade zu Ihren Dateien. 2) Führen Sie in Schleife, suchen Dateien in jedem Verzeichnis, erhalten mit head -n100 ersten 100 Dateien, kopieren Sie diese mit xargs

+0

Die Option '-r 'ist anscheinend illegal, vielleicht ist es nicht auf einem Mac verfügbar? –

+0

Ich habe gesehen, Macs sed ist nicht das gleiche wie Linux sed. Ich bin mir also nicht sicher, ob ich Ihnen bei dieser Frage helfen kann. –

+0

@YeshwanthNapolean verwenden '-E' dann. – PesaThe

Verwandte Themen