Text aus Datei filtern und neuen Ordner erstellen

Hi Pill

Ich habe nicht die leiseste Ahnung wie dieser Code aufgebaut ist aber er funktioniert einwandfrei!

DANKE!!!!
 
Ich versuche mal es zumindest grob zu erklären:

Code:
[COLOR=#ff0000]find "/Users/DeinName/Desktop/Rec/Klienten" -type f -name "[^.]*"[/COLOR] | [COLOR=#006400]while read file[/COLOR]; [COLOR=#00ff00]do mv "$file"  "${file%/*}/${file#* }"[/COLOR]; [COLOR=#006400]done[/COLOR]

find sucht im angegebenen Pfad nach alle Dateien vom Typ Datei (-type f) und deren Name nicht mit einem Punkt beginnen ("[^.]*", Google: regular expression, kurz regex). find gibt die Dateien dann zeilenweise aus. Mit | leitet man diese Ausgabe dann an den nächsten Befehl weiter.

while read file geht nun die Dateien der Reihe nach in einer Schleife durch, dabei wird die aktuelle Datei in der Variablen $file gespeichert. Alles was nun zwischen do und done steht, wird für jede Datei einmal ausgeführt. In diesem Fall ist das der Befehl mv.

mv "/A/Datei" "/B/Datei" bewegt eine Datei von A nach B. Das kann auch benutzt werden, um Dateien umzubenennen. Der erste Pfad ist bereits in $file gespeichert, den zweiten Teil erhalten wir durch String-Zerlegung des ersten Pfades:

$file gibt "/Pfad/zu/deiner Datei" aus
${file%/*} gibt den Pfad bis zum letzten "/" aus: "/Pfad/zu"
${file#* } gibt den Pfad ab dem letzten " " aus: "Datei"

Dazwischen fehlt noch ein "/", das kann man einfach dazwischen schreiben und dann wird daraus "/Pfad/zu/Datei". Mehr zur String-Zerlegung findest du hier:
http://www.lansys.ch/shell/strings.htm
 
Kann ich diese beiden Codes auch mit dem Automator starten? Ich habe ein bisschen gegoogelt und die Antworten sind recht unterschiedlich...
 
Natürlich geht das:

attachment.php


Code:
for i in "$@"/*;
    do if [ -f "$i" ]; 
        then mkdir -p "${i% *}"; 
        mv "$i" "${i% *}/${i#* }"; 
    fi;
done

Der Ablauf fragt dich nach dem Ordner mit den Dateien, verschiebt dann alle Dateien in einen neuen Ordner und benennt sie dabei gleich um.
 

Anhänge

  • Bildschirmfoto 2013-07-11 um 13.34.31.png
    Bildschirmfoto 2013-07-11 um 13.34.31.png
    61,1 KB · Aufrufe: 121
Ich habe jetzt noch eine Frage. Ist es auch möglich dass man Dateien den Namen der Ordner und Unterordner anhängt und sie alle in einen neuen Ordner kopiert? Dann könnte ich sie alle mit einem Batch in ein anderes Format umwandeln! Als nächstes sollen die Dateien wieder aufgesplitter werden sodass die Ordnerstruktur mit Unterordner und Dateiname wieder die selbe Struktur hat. Es hat sich dann nur die Dateiendung bzw das Format geändert! Wenn es geht dann bitte mit einem Automator Programm :)
Danke!!!
 
Von welchem in welches Format möchtest du die Dateien denn konvertieren und welches Programm benutzt du dazu? Eventuell lässt sich dein Problem auch durch einen intelligenten Ordner lösen, das erscheint mir einfacher.
 
Ich möchte meine .wav Dateien in das rx2 Format konvertieren! Gemacht wird das mit Recycle von Propellerhead.
 
Das sollte doch dann mit einem intelligentem Ordner machbar sein, oder nicht?
 
Daran habe ich noch gar nicht gedacht! Ich war so fasziniert von deiner Hilfe dass ich wohl über das Ziel hinausgeschossen bin.
 
Leider geht das mit den intelligenten Ordnern nicht! Das Programm Quickeys kennt den Ordner nicht an. Mit diesem App wollte ich den Batch machen!
 
Dieser Befehl kopiert alle .wav-Dateien wieder in den Ordner Klienten:

Code:
find "/Users/Name/Desktop/Rec/Klienten" -type f -name "*.wav" | while read file; do mv "$file" "${file%/*} ${file##*/}"; done;

Ich hoffe übrigens, du hast ein Backup. Nicht, dass plötzlich alles durcheinander ist.
 
HI PILL

Danke vielmals. Ich werde mich mal damit rumspielen und ich hoffe ich bekomme es hin. Wenn es wieder mal nicht funktionieren sollte, darf ich wieder lästig sein :) ?

LG
 
Und da bin ich schon wieder.

Kann es sein dass Dein Automator App bei ca 400 Dateien mit recht langen Namen seeehhhhhr lange braucht bzw es nicht schafft? Wenn ich es ein paar Minuten laufen lasse und abbreche dann sind zwar die Ornder da, aber die Dateien wurden nicht hineinkopiert.

Danke
 
Ich habe das gerade mal getestet:

Mit touch hh{1..1000}\ SOoooEinLaaaaaaaaaaAAAAAAaaaaaangerDateiname.txt 1000 leere Dateien mit langem Dateinamen erstellt und das Skript drüberlaufen lassen, das hat bei mir weniger als 30s gedauert. Für mich sieht das eher nach einem Fehler im Skript aus. Einen Fehler habe ich übrigens bereits gefunden, der zwar wahrscheinlich nichts mit dieser Sache zu tun hat, aber dennoch behoben werden sollte. Korrekt heisst das Skript aus dem Automatorprogramm so:

Code:
for i in "$@"/*;
     do if [ -f "$i" ];
          then mkdir -p "${i% *}";
          mv "$i" "${i% *}/${i#[COLOR=#ff0000]#[/COLOR]* }";
      fi;
 done

Leider kann ich den ursprünglichen Post nicht mehr korrigieren.

Um zu wissen, warum das so lange dauert, könntest du mal folgendes Skript im Automator ausprobieren:

Code:
for i in "$@"/*;
     do if [ -f "$i" ];
          then echo mkdir -p "${i% *}";
          echo mv "$i" "${i% *}/${i##* }";
      fi;
 done

Wenn du bei der "Shell-Skript ausführen"-Aktion auf "Ergebnisse" klickst, dann solltest du eine Ausgabe bekommen. Die einfach mal hier posten (der Anfang reicht).
 
Zuletzt bearbeitet:
Danke für deine tolle Hilfe!!!! Ich werde es so schnell es geht probieren
 
Hi Pill

Jetzt geht es!!!!! Ich habe einen neuen Ordner angelegt und die Datein dann hineinkopiert und den Pfad dementsprechend geändert! Und das #-Symbol habe ich auch ersetzt. Jetzt muss ich dann nur noch irgendwie die leeren Ordner löschen und der Fall ist gelöst.

Danke
 
Zurück
Oben Unten