devbaum

Find Einzeiler für Filter Basename Dateien

Hallo,
es wäre große Klasse, wenn mir geholfen wird.
Ich versuche schon seit ein paar Wochen mein Problem mit find zu lösen, aber vielleicht ist es so gar nicht möglich.
Ich hoffe, ich bekomme dazu einen Tipp oder sogar eine Lösung.
Mein Problem.
Ich habe in einem Verzeichnis sehr viele Dateien und Ordner. Im Moment ca. 140000.
Es gibt immer ein 4er Paket. 3 Dateien und einen Ordner, die den gleichen Basisnamen haben.
Nur der zugehörige Ordnername hat nicht die ersten 3 Zeichen, die die Dateinamen haben.
Z.B.
1. Datei: MKL2025051700005.dat
2. Datei: MKL2025051700005.opp
3. Datei: MKL2025051700005.int
Ordnername: 2025051700005

Diese 4er Pakete möchte ich in ein anderes Verzeichnis verschieben, aber nur wenn es vollständig ist.
Kann ich dabei bitte Hilfe bekommen oder geht das gar nicht mit find?
Ich bin leider noch immer Anfänger. Wenn meine Beschreibung ungenau ist, bitte ich um Nachsicht.

Ich Danke schon mal allen die helfen möchten.
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 674060

Url: https://administrator.de/forum/find-dateien-verschieben-paket-674060.html

Ausgedruckt am: 29.07.2025 um 19:07 Uhr

BiberMan
Lösung BiberMan 29.07.2025 aktualisiert um 11:14:23 Uhr
#!/bin/bash
# source folder
source="/path/to/source"  
# destination folder
dest="/path/to/destination"  
baseuniq=$(find $source -type f -name "*.dat" -exec basename {} .dat \; | uniq)  
for base in $baseuniq ;do
    files=$(find $source -type f -name "${base}.dat" -o -name "${base}.opp" -o -name "${base}.int")  
    folder=$(find $source -type d -name "${base:3}")  
    if [[ $(echo "$files" | wc -l) -eq 3 && -d "$folder" ]] ;then  
        mkdir $dest/$base >/dev/null 2>&1
        cp $files $dest/$base/
        cp -r $folder $dest/$base/
    fi
done
devbaum
devbaum 29.07.2025 um 11:34:00 Uhr
Vielen Dank BiberMan,
da war ich mit meinen Versuchen ganz weit entfernt.
Eine riesige Hilfe. Ich probiere es heute Abend und melde mich danach.
face-smile
devbaum
devbaum 29.07.2025 um 13:08:29 Uhr
Ich habe es 1:1 übernommen, aber bekomme es nicht hin.
Ich weiß nicht wo ein Fehler sein soll.
Fehlerinfo:
line 14: syntax error in conditional expression: unexpected token `&'
line 14: syntax error near `&'
line 14: ` if [[ $(echo "$files" | wc -l) -eq 3 & -d "$folder" ]] ;then'
BiberMan
BiberMan 29.07.2025 aktualisiert um 15:10:31 Uhr
Hast es laut der Meldung nicht richtig übernommen. Das & muss doppelt sein && ... Klappt hier im Test wunderbar.
Ich habe es 1:1 übernommen
Naja Pfade musst du schon an deine Gegebenheiten anpassen.

Mein Anwendungsbeispiel:
Grünes set complete, rotes set incomplete (*.int fehlt)

1000005360
devbaum
devbaum 29.07.2025 um 15:57:01 Uhr
Ja, die Pfade hatte ich angepasst.
Das Problem bei mir ist irgendwo in der If-Abfrage.
Mit dem 1. Teil bis zum && funktioniert der Durchlauf. Da fehlt dann ist die Abfrage unvollständig.
Ich kann nicht rausfinden was da bei mir nicht passt.
Damit geht es:
if [ $(echo "$files" | wc -l) -eq 3] ;then
BiberMan
Lösung BiberMan 29.07.2025 aktualisiert um 16:28:40 Uhr
Liegt dann wohl an deinem verwendeten System statt && lässt sich auch -a als Boolean UND-Operator verwenden wenn in deiner Shell nur single brackets nutzen kanns, gibt ja viele Wege nach Rom:
tldp.org/LDP/abs/html/comparison-ops.html
Kommt eben drauf an welche Shell und OS du gerade nutzt. Klappt hier auf Debian, ArchLinux, etc. in der Bash Shell ohne Probleme.
Also entweder beschnittenes System/Shell oder Copy n Paste Fehler, also noch mal penibel vergleichen und Shell checken.

Wenn bei dir nur single Brackets in deiner verwendeten Shell gehen dann geht's auch so
if [ $(echo "$files" | wc -l) -eq 3 -a -d "$folder" ] ;then  

Wenn's das dann war bitte Haken dran. Danke.
devbaum
devbaum 29.07.2025 um 18:27:19 Uhr
Das war die Lösung.
Herzlichen Dank für Hilfe und die Geduld.
Perfekt. Der Abend wird schön face-smile
BiberMan
BiberMan 29.07.2025 um 18:55:08 Uhr
Gerne, schönen Abend 👋