ubuntuusers.de

Script zum umbenennen von Dateien

Status: Ungelöst | Ubuntu-Version: Ubuntu 22.04 (Jammy Jellyfish)
Antworten |

Smashi

Anmeldungsdatum:
20. September 2022

Beiträge: Zähle...

Hallo,

ich fange gerade erst an mich mit Linux und Scripten zu beschäftigen. Von daher entschuldige ich mich schon einmal für die Frage, aber egal welchen Post ich mir anschaue und versuche umzusetzen, es will einfach nicht klappen. Von daher würde ich euch um einen Denkanstoß bitten. Wenn ich das schon nicht hinbekommen sollte, dann kann ich auch aufhören.

Hier mein Script:

1
2
3
4
5
6
7
8
9
files=$(find ~/Dokumente/Belegtransfer/G2/ -mindepth 1 -name "*.pdf")

for file in "$files"

do 
	
   mv "$file" $(dirname "$file")/$(date +"%Y%m%d")-G2-Eingangsbeleg-$(uuidgen).pdf
	
done

Das Script soll die Unterordner im Ordner G2 nach PDF Dateien durchsuchen und umbenennen. Innerhalb der Schleife sollen dann später noch If Ausdrücke entstehen.

Zuerst hatte ich das Problem, dass mv nicht mit Leerzeichen im Quelldateinamen klar kam, das glaube ich aber behoben zu haben. Jetzt bekomme ich allerdings die Fehlermeldung das das Angegebene Verzeichnis kein Ziel wäre. Für mich sieht das aber in Ordnung aus.

Was mache ich falsch?

Danke und Gruß

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9626

Wohnort: Münster

Smashi schrieb:

[…]

Ein kleiner Paxistipp:

Bevor Du so etwas ausführst:

files=$(find ~/Dokumente/Belegtransfer/G2/ -mindepth 1 -name "*.pdf")

for file in "$files"

do 
	
   mv "$file" $(dirname "$file")/$(date +"%Y%m%d")-G2-Eingangsbeleg-$(uuidgen).pdf
	
done

Probiere es erst einmal mit diesem Skript:

files=$(find ~/Dokumente/Belegtransfer/G2/ -mindepth 1 -name "*.pdf")
 
for file in "$files"
 
do 
 	
    echo mv "$file" $(dirname "$file")/$(date +"%Y%m%d")-G2-Eingangsbeleg-$(uuidgen).pdf
 	
done

Du siehst dann, was passieren würde, bevor Unheil angerichtet wird. Im konkreten Beispiel wirst Du so vermutlich bemerken, dass in der for-Zeile diesmal die Quotierung der Variablen nicht richtig ist. (Und weitere Fehler)

[…] Leerzeichen im Quelldateinamen

Sind zulässig, machen aber immer Schwierigkeiten! Umso wichtiger ist es, immer vorher per echo zu prüfen, was man da wirklich programmiert hat.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11248

Wohnort: München

Smashi schrieb:

Hier mein Script:

1
   mv "$file" $(dirname "$file")/$(date +"%Y%m%d")-G2-Eingangsbeleg-$(uuidgen).pdf

Da musst du den Zielpfad, den du zusammenbaust quoten - das Ergebnis der Subshell mit dem dirname-Befehl könnte ja auch Leerzeichen enthalten:

1
   mv "$file" "$(dirname "$file")/$(date +"%Y%m%d")-G2-Eingangsbeleg-$(uuidgen).pdf"

Ich würde mir überlegen, ob man da mit Python3 und der pathlib nicht mehr Spaß hat (kein Ärger mit Quoting):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/usr/bin/env python3
import datetime
import sys
import uuid
from pathlib import Path

for directory in sys.argv[1:]:
    for pdf_path in Path(directory).rglob('*.pdf'):
        if not pdf_path.is_file():
            continue
        target = pdf_path.parent / f"{datetime.date.today().strftime('%Y%m%d')}-G2-Eingangsbeleg-{uuid.uuid1()}.pdf"
        print(f"rename '{pdf_path}' to '{target}')
        pdf_path.rename(target)

Das Skript kann man dann mit dem oder den gewünschten Verzeichnis(sen) aufrufen, in denen PDF-Dateien umbenannt werden sollen.

Smashi

(Themenstarter)

Anmeldungsdatum:
20. September 2022

Beiträge: 2

Danke für eure Antworten. Ich muss wohl noch etwas Lektüre studieren ☺.

Es werden vermutlich immer noch Fehler drin sein, aber es funktioniert mit oder ohne Leerzeichen im Dateinamen:

1
2
3
4
5
6
7
8
9
files=~/Dokumente/Belegtransfer/G2/*/*.pdf

for file in $files;

do 
	
	mv "$file" "$(dirname "$file")/$(date +"%Y%m%d")-G2-Test $(uuidgen).pdf";
	
done

Danke und Gruß

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

Smashi schrieb:

Es werden vermutlich immer noch Fehler drin sein, aber es funktioniert mit oder ohne Leerzeichen im Dateinamen:

1
2
3
4
5
6
7
8
9
files=~/Dokumente/Belegtransfer/G2/*/*.pdf

for file in $files;

do 
	
	mv "$file" "$(dirname "$file")/$(date +"%Y%m%d")-G2-Test $(uuidgen).pdf";
	
done

Du kannst das einfach reparieren:

1
2
3
4
5
6
#!/bin/sh

for file in ~/Dokumente/Belegtransfer/G2/*/*.pdf
do 
  mv "$file" "$(dirname "$file")/$(date '+%Y%m%d')-G2-Test $(uuidgen).pdf"
done

Der Umweg über die Variable macht es unnötig schlimmer. Und das Semikolon wird nur benötigt, wenn Du auf einer Zeile mehrere Shell-Kommandos unterbringen willst.

Antworten |