2017-05-28 2 views
1

Also bin ich ein Coding-Neuling und habe seit einiger Zeit die Formatierung meiner ziemlich umfangreichen Live-Musikbibliothek bearbeiten wollen. Ich habe mich hier und verschiedene andere Quellen umgesehen, um dahin zu kommen, wo ich bin, aber ich habe einen Haken gefunden. Ich habe Verzeichnisse auf die folgenden Arten benannt:Umbenennen von Dateien/Verzeichnissen von einem Datumsformat in ein anderes

  • 02.10.90 | 23 East Caberet - Ardmore, PA
  • 02.16.90 | Das Paradies - Boston, MA

und ich möchte diese umbenennen einfach zu

  • 1990-02-10 | 23 East Caberet - Ardmore, PA
  • 1990-02-16 | Das Paradies - Boston, MA

Ich habe das Datum benennen konnte korrekt mit:

ls -1 | grep 90 | awk '{print $1}' | awk -F. '{printf "%s-%s-%s\n", "19"$3,$1,$2}' > list1.txt 

und dann den Rest der

ls -1 | grep 90 | awk '{first = $1; $1 = ""; print $0}'>list2.txt 

Also mit Namen ziehen, ich habe eine Liste von Verzeichnissen aus den Jahren 1990-2004, auf die ich das anwenden möchte (sie befinden sich alle in verschiedenen Unterverzeichnissen, so dass es mir nichts ausmacht, das "grep 90" manuell zu ändern. Allerdings aus den zwei separaten Listen, die ich erstelle Ich kann nicht herausfinden, wie man es macht durch jede Zeile und print „mv original_name list1.txt + list2.txt“, so dass es lesen würde:

mv 02.10.90 | 23 East Caberet - Ardmore, PA 1990-02-10 | 23 East Caberet - Ardmore, PA 

ich durch viele frühere Beiträge gescannt und das letzte Stück heraus nicht ganz konnte - oder besser noch, eine elegantere Lösung! Jede Hilfe wird sehr geschätzt, danke im Voraus!

Antwort

0

Parsen Sie nicht die Ausgabe von ls, google warum, und Sie brauchen nicht Grep, wenn Sie awk verwenden, noch brauchen Sie Ketten von awk Befehle, aber für diese Aufgabe würden Sie keine von denen verwenden Befehle sowieso.

Der UNIX-Befehl zum Suchen von Dateien heißt find, also fangen Sie damit an. Dadurch wird alle Verzeichnisse mit Namen, mit dem angegebenen Globbing Muster findet Ausgang:

find . -type d -name '[0-9][0-9].[0-9][0-9].90 *' 

Nun, da Sie die Dateien, die Sie etwas mit ihnen tun müssen gefunden haben. Für Ihre Bedürfnisse IMHO der einfachste Ansatz ist am besten, und das wäre:

find . -type d -name '[0-9][0-9].[0-9][0-9].90 *' -print0 | 
while IFS= read -r -d '' old; do 
    path="$(dirname "$old")" 
    oldDirName="$(basename "$old")" 
    if [[ oldDirName =~ ([0-9]+)\.([0-9]+)\.([0-9]+)(.*) ]]; then 
     newDirName="19${BASH_REMATCH[3]}-${BASH_REMATCH[1]}-${BASH_REMATCH[2]}${BASH_REMATCH[4]} 
     echo mv -- "${path}/${oldDirName}" "${path}/${newDirName}" 
    fi 
done 

Das obige wird mit GNU für -print0 und bash für BASH_REMATCH finden. Entfernen Sie die echo, wenn Sie es bei Bedarf debugged und sind mit dem, was es tun wird, glücklich.

+0

Vielen Dank für Ihre Hilfe! Das gibt viel Einblick in mein Problem - das einzige, was ich nicht erwähnt habe, ist, dass ich Mac OS Sierra laufen lasse und nicht glaube, dass die GNU-Befehle in meinem Bash funktionieren. Ich werde versuchen, damit herumzuspielen, um zu sehen, ob ich es zur Arbeit bringen kann. – PGruven

+0

Sie können GNU-Tools auf einem Mac installieren. Google es. Andernfalls, wenn Ihre Dateinamen keine Zeilenumbrüche enthalten, entfernen Sie die '-print0' von find und '-d' 'von lesen und der Rest sollte so funktionieren wie er ist. –

Verwandte Themen