#1 16.02.2018 11:02:27

Sven93
Gast

Shell Script automatzisch Ordner erstellen mit Monat

Hallo,

ich bin noch blutiger Anfänger was ShellScripte angeht.
Ich will ein Script schreiben welches automatisch aus einem Ordner die Dateien (home/sven/daten) in ein anderes neues Verzeichnis (/home/sven/backup) kopiert.
Die neuen Verzeichnisse sollen so angelegt werden: Der Hauptordner soll als Name das aktuelle Jahr bekommen, also 2018 und der Unterordner den aktuellen Monat, also z.B. Februar usw.
Im Ordner Februar sollen dann alle dateien hineinkopiert werden, am besten mit dem Tagesdatum davor für die bessere Sortierung, also z.B 16-dateiname für den 16 Tag im Monat Februar

Mein Script macht momentan folgendes:
Es wird der Hauptordner für das aktuelle Jahr angelegt (2018) und darin dann ein Unterordner für den Monat (02). Darin landen dann alle Dateien:

#!/bin/sh
# Erzeuge Verzeichnisse aller unterschiedlichen File-Erstellungsdatum
#
# Liste nur Files auf...keine directories!

cd /home/seven/daten

for file in $(ls -l | awk 'NR!=1 && !/^d/ {print $NF}')
do
DIRNAME=$(stat -c "%y" $file | awk -F- '{print $1"/"$2}')
[ -d $DIRNAME] || mkdir -p /home/sven/backup/$DIRNAME 
done
#
# mv files je nach Erzeugungsdatum in entsprechende unterordner
for file in $(ls -l | awk 'NR!=1 && !/^d/ {print $NF}')
do
TARGETDIR=$(stat -c "%y" $file | awk -F- '{print $1"/"$2}')
mv $file /home/admin/backup/$TARGETDIR
done

ich schaffe es einfach nicht das Script anzupassen.

#2 16.02.2018 11:13:28

Sven 93
Gast

Re: Shell Script automatzisch Ordner erstellen mit Monat

Im Script beim mv Befehl muss es natürlich heissen:

mv $file /home/sven/backup/$TARGETDIR

#3 16.02.2018 11:23:13

schard
Mitglied

Re: Shell Script automatzisch Ordner erstellen mit Monat

1) Dein Skript kopiert keine Dateien, es verschiebt sie.
2) Dein Code is WET. Der Aufruf von

for file in $(ls -l | awk 'NR!=1 && !/^d/ {print $NF}')
do
…$(stat -c "%y" $file | awk -F- '{print $1"/"$2}')

kommt doppelt vor.
3) Halte dich an eine Shell-Style guideline. Zum Beispiel diese.

Offline

#4 16.02.2018 11:29:40

schard
Mitglied

Re: Shell Script automatzisch Ordner erstellen mit Monat

Sven 93 schrieb:

Im Script beim mv Befehl muss es natürlich heissen:

mv $file /home/sven/backup/$TARGETDIR

Und wahrscheinlich auch

cd /home/sven/daten

Offline

#5 16.02.2018 11:33:33

Cr
Mitglied

Re: Shell Script automatzisch Ordner erstellen mit Monat

mkdir -p "/home/sven/backup/`date +%Y`/`date +%m`/"
cp -a "/home/sven/daten" "/home/sven/backup/`date +%Y`/`date +%m`/`date +%d.%m.%Y`/"

Offline

#6 16.02.2018 13:03:44

rriw
Gast

Re: Shell Script automatzisch Ordner erstellen mit Monat

Du musst aufpassen, wenn in den Dateinamen Sonderzeichen vorkommen, z.B. Leerzeichen, " und ein paar andere.
Dies sind ein paar Vorschläge, die Probleme zu umschiffen. Wenn alles passt, kannst du die echos entfernen.

#!/bin/bash

ziel="/home/sven/backup"
daten="/home/sven/daten"

find "$daten" -type f -printf "%CY %Cm %Cd %f\0" | while read -r $'\0' jahr monat tag datei ; do
  echo mkdir -p "${ziel}/${jahr}/${monat}"
  echo mv "${daten}/${datei}" "${ziel}/${jahr}/${monat}/${tag}-${datei}"
done

#7 16.02.2018 14:52:07

Sven93
Gast

Re: Shell Script automatzisch Ordner erstellen mit Monat

rriw schrieb:

Du musst aufpassen, wenn in den Dateinamen Sonderzeichen vorkommen, z.B. Leerzeichen, " und ein paar andere.
Dies sind ein paar Vorschläge, die Probleme zu umschiffen. Wenn alles passt, kannst du die echos entfernen.

#!/bin/bash

ziel="/home/sven/backup"
daten="/home/sven/daten"

find "$daten" -type f -printf "%CY %Cm %Cd %f\0" | while read -r $'\0' jahr monat tag datei ; do
  echo mkdir -p "${ziel}/${jahr}/${monat}"
  echo mv "${daten}/${datei}" "${ziel}/${jahr}/${monat}/${tag}-${datei}"
done

Vielen Dank für Eure Hilfe. Ich habe mir mal Dein Script angeschaut. Es läuft aber auf einen Fehler: 

./test.sh: Zeile 6: read: `$'\0'': Ist kein gültiger Bezeichner.

Was bewirkt den $'\0' ?

#8 16.02.2018 15:15:08

rriw
Gast

Re: Shell Script automatzisch Ordner erstellen mit Monat

schade, sorry read -r -d $'\0' müsste es heissen.

$'\0' ist der NUL String, dieser kann nicht in Dateinamen vorkommen. Darum separieren wir damit die einzelnen Suchresultate ('-prinf 'text\0'). Dies kannst du beobachten, wenn du nur das find Kommando ausführst. Das '-d' Flag von Read setzt den Zeilendelimiter, damit wird garantiert, dass read jedes Suchresultat einzeln liest.

Hier die lange Erklärung (englisch):
https://stackoverflow.com/questions/365 … to-and-why

#9 16.02.2018 16:21:17

Sven93
Gast

Re: Shell Script automatzisch Ordner erstellen mit Monat

Super :-)

So funktioniert es wie geplant.
Damit ich das aber irgendwann mal selber kann muss ich noch einige Kurse dazu belegen.

#10 27.02.2018 21:24:55

Sven93
Gast

Re: Shell Script automatzisch Ordner erstellen mit Monat

Hallo,

erst mal nochmals vielen Dank für die Unterstützung :-)
Ich habe mittlerweile ein Skript mir "zurechtgebastelt" welches auch einigermaßen funktioniert.

Es werden jeden Tag PDF-Dokumente mit einem Scanner eingescannt und landen auf direkt auf meinem Linuxrechner in einem Ordner.
Dieser Ordner wird mittels inotifywait überwacht. Sobald eine PDF-Datei erkannt wird erfolgt die Texterkennung mittels ocrmypdf.
Nach der OCR-Erkennung werden die PDF's auf ein Netzlaufwerk verschoben wo sie den Anwendern zur Verfügung stehen.

Auf dem Netzlaufwerk wird dabei folgende Ordnerstruktur erstellt: [Jahr]/[Monat]

z.B.

2018/Februar/Datei.pdf

Im Monat März wird sieht es dann so aus: 2018/März/Datei.pdf usw.....

Das ist mein Skript:

#!/bin/bash

cd /home/ocr/Eingang

inotifywait -mrq -e create --format %f /home/ocr/Eingang | while read FILE
sleep 240 # 4 Min Wartezeit weil bei vielen Scans gleichzeitig inotifywait nicht die neuen PDFs erkennen kann
do
  case $FILE in
      *.pdf)
      ocrmypdf -l deu $FILE /home/ocr/Eingang/$FILE;

	ausgang="/home/ocr/Ausgang"
	eingang="/home/ocr/Eingang"
	#datum=$(date +%Y-%m-%d)

	find "$eingang" -type f -printf "%CY %CB %Cd %f\0" | while read -r -d $'\0' jahr monat tag datei ; do
  	mkdir -p "${ausgang}/${jahr}/${monat}"
  	
	mv "${eingang}/${FILE}" "${ausgang}/${jahr}/${monat}/${tag}-${FILE}"
	done
  esac
done

Jetzt habe ich noch das Problem das ich die PDF-Datei beim verschieben umbennen möchte.
Wenn ein Dokument vom Scanner eingescannt wird bekommt es diesen Namen:

[Druckename][Datum][Zähler]

also z.B.

Farblaser20180227333

Diese Datei will ich gerne beim verschieben umbennen in: [Datum][Zähler]

also z.B.

2018-02-27-001

Der Zähler soll für einen Monat gültig sein und im nöchsten Monat wieder bei EINS anfangen.

Wie kann ich das umsetzen?

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Deine Antwort

Fußzeile des Forums