ubuntuusers.de

In Shell kopieren und umbenennen

Status: Ungelöst | Ubuntu-Version: Ubuntu 23.04 (Lunar Lobster)
Antworten |

safrano

Anmeldungsdatum:
12. Februar 2023

Beiträge: 6

Hallo,

habe hier eine HDD auf der eine APFS (Mac) Partition drauf ist. Die Dateinamen beinhalten da Sonderzeichen wie "?" und ":" usw.

ich kann die Festplatte einbinden Read-Only und bräuchte nun zum Kopierbefehl cp ein paar Ergänzungen (oder über die Pipe) sodass die Ganzen Dateinamen abgeändert werden auf Maximale Kompatibilität (Also auch wenn nötig den Dateinamen kürzen, Leerzeichen wären dennoch gut wenn die erhalten blieben) Wenn dann etwas Information verloren geht ists dennoch nicht so schlimm hauptsache die Daten sind gebackuped und kompatibel zum Einbinden.

Danke

micneu

Avatar von micneu

Anmeldungsdatum:
19. Januar 2021

Beiträge: 671

Wohnort: Hamburg

Moin, warum machst du das nicht an einer macOS Hardware?

  • ich persönlich würde auch die LEERZEICHEN durch "_" ersetzen

  • bau dir doch ein ein REGEX für sed

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13121

safrano schrieb:

habe hier eine HDD auf der eine APFS (Mac) Partition drauf ist. Die Dateinamen beinhalten da Sonderzeichen wie "?" und ":" usw.

ich kann die Festplatte einbinden Read-Only und bräuchte nun zum Kopierbefehl cp ein paar Ergänzungen (oder über die Pipe) sodass die Ganzen Dateinamen abgeändert werden auf Maximale Kompatibilität (Also auch wenn nötig den Dateinamen kürzen, Leerzeichen wären dennoch gut wenn die erhalten blieben) Wenn dann etwas Information verloren geht ists dennoch nicht so schlimm hauptsache die Daten sind gebackuped und kompatibel zum Einbinden.

Eigentlich geht ziemlich viel in Unix-Dateinamen. Fragezeichen und Doppelpunkt sind mehr ein Problem für Windows-Systeme. Mit cp wirst Du das nicht lösen können, denn Du willst die Namen ja ändern. Das macht cp nicht. Ich würde es erst mal probieren, alle Dateien so zu kopieren. Wenn das klappt, kannst Du hinterher mit find und rename die Namen ändern. Das könnte dann so aussehen:

1
find dir -depth -exec rename -n --filename 's#[_?:]+#_#g' {} +

"-n" erzeugt nur eine Ausgabe. Das musst Du rausnehmen, wenn Du dann wirklich umbenennen willst.

Berlin_1946 Team-Icon

Supporter, Wikiteam

Anmeldungsdatum:
18. September 2009

Beiträge: 10102

Hallo safrano willkommen bei UU.de

Lunar Lobster

Unterstützt bis: 25. Januar 2024

das mal bitte lesen: Upgrade

shiro

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1214

Hallo safrano,

ein kleiner Tip, um heraus zu finden, welche Zeichen dich stören, kannst du ja mal schauen, welche überhaupt (und in welcher Häufigkeit) verwendet werden mit dem Befehl

$ find | sed 's/./&\n/g' | sort | uniq -c
   3907 
     19  
      1 %
      7 (
      7 )
     18 +
      1 ,
   1577 -
   6918 .
  24003 /
      3 [
   2332 _
      2 ~
      1 »
      1 –
   1446 0
   1816 1
...

Manchmal sehen Zeichen sehr ähnlich aus, wie "-" (x2d) und "–" (xe2 x80 x93). Dabei kannst du dir dann auch überlegen, in welches Zeichen diese konvertiert werden sollen.

Beispiel wobei Dateien mit den Zeichen "%»–" umbenannt werden sollen:

$ find -regex '.*[%»–]+.*' | sed 'h;y/%»–/_--/;x;G;s/^/mv "/;s/\n/" "/;s/$/"/'

Sorry für meine kleine "sed" Spielerei, aber das juckte mir grad in den Fingern. Mit obiger "sed" Zeichenkette bekommt man die Befehle zum Umbenennen gelistet. Wenn man am Ende ein "e" anfügt (also z.B. statt 's/$/"/' ein 's/$/"/e', wird die Umbenennung auch ausgeführt.

Falls man das "sed" nicht sofort versteht, hier eine kleine Beschreibung:

  • h schiebt den Dateinamen unverändert in den "hold" Bereich

  • y führt die Zeichenänderung gemäß Mapping-Tabelle "y/von/nach/" im "pattern" Bereich durch

  • x tauscht "hold" und "pattern" Bereich, damit im "pattern" der ursprüngliche Dateiname steht

  • G hängt den Inhalt aus "hold" an den "pattern" Bereich (OldFile\nNewFile)

  • 1.s Am Anfang wird der Text 'mv "' eingefügt

  • 2.s Das "\n" vom "G" wird zu einem " " gewandelt

  • 3.s Am Ende wird ein '"' eingefügt.

  • e Die Zeile im "pattern" Bereich wird ausgeführt (d.h. die Umbenennung gemacht)

safran

Anmeldungsdatum:
30. April 2023

Beiträge: 12

Hallo vielen Dank für die vielen Antworten,

ich möchte auf dem Datenträger keine Umbenennung durchführen, zumal dieser ja eh "nur" Read-Only eingehängt ist.

Bei der Umbenennung darf es sehr gerne auch etwas brutaler vorgehen: gerne die Direktive alle Dateinamen auf 32 Zeichen zu kürzen und alle Sonderzeichen schlichtweg rauszulöschen.

Keine Angst die Dateinamen gehen ja auch nicht verloren ☺

1
tree > /home/user/backup/index.txt

Wie könnte das gehen? Statistiken wie oft bei diesem Datenträger die unerwünschten Zeichen vorkommen kann ich später gerne nachreichen, wie gesagt, es geht auch nicht nur um ein einmaliges Backup sondern es sollte schon quartalsweise gemacht werden und dann brauchts mich nicht interessieren wie wer welche Datei genannt hat, sind aber überwiegend Fragezeichen und Doppelpunkte.

Müsste doch als Einzeiler gehen mit | und dem Wurzel- und Zielvereichnis oder?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13121

safran schrieb:

ich möchte auf dem Datenträger keine Umbenennung durchführen, zumal dieser ja eh "nur" Read-Only eingehängt ist.

Der Zieldatenträger natürlich nicht. Deshalb mein Vorschlag, erst mit rsync kopieren und dann am Ziel mit find und rename umbenennen.

safran

Anmeldungsdatum:
30. April 2023

Beiträge: 12

auf dem Zieldatenträger ja schon, nur auf dem Ursprungsdatenträger nicht.

kann ich denn nicht das ganze Verzeichnis Datei für Datei auslesen, und dann bei jedem Dateinamen diesen der Routine unterziehen alle Sonderzeichen löschen und kürzen auf 32 Zeichen und diesen dann ins Zielverzeichnis kopieren? Das wäre dann sogar FAT32 wie es ja noch bei USB Sticks gängig ist kompatibel, sofern nicht zu groß.

Mit rsync hab ich ja erstmal die Sonderzeichen mit auf dem Datenträger, das will ich umgehen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13121

safran schrieb:

kann ich denn nicht das ganze Verzeichnis Datei für Datei auslesen, und dann bei jedem Dateinamen diesen der Routine unterziehen alle Sonderzeichen löschen und kürzen auf 32 Zeichen und diesen dann ins Zielverzeichnis kopieren? Das wäre dann sogar FAT32 wie es ja noch bei USB Sticks gängig ist kompatibel, sofern nicht zu groß.

Gut, das macht natürlich Sinn, wenn Du FAT nutzen willst.

Mit rsync hab ich ja erstmal die Sonderzeichen mit auf dem Datenträger, das will ich umgehen.

Achso. Ja, klar kann man das machen. Ist halt etwas umständlicher - jedenfalls kein Einzeiler.

safran

Anmeldungsdatum:
30. April 2023

Beiträge: 12

habe leider selber nie SED und AWK gelernt und mich immer davor gedrückt und wahrscheinlich in den Skripten mehr CODE benutzt.

würde dann auf sowas hinauslaufen:

While du -a

.....

$line = $line_ziel (modifiziert, alle Sonderzeichen löschen und verkürzen)

cp /line (absoluter Pfad) ./BACKUP/line_ziel

safrano

(Themenstarter)

Anmeldungsdatum:
12. Februar 2023

Beiträge: 6

hab mal Chatgpt rangelassen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

# Funktion zur Bereinigung von Sonderzeichen und Umlauten
sanitize_filename() {
    echo "$1" | iconv -c -f utf-8 -t ascii//TRANSLIT | tr -d '[:punct:]' | tr -d '[:space:]'
}

# Quellverzeichnis und Zielverzeichnis
source_dir="Quellverzeichnis/A"
destination_dir="Zielverzeichnis/B"

# Rekursives Kopieren und Umbenennen der Dateien
find "$source_dir" -type f | while read -r file; do
    filename=$(basename "$file")
    sanitized_filename=$(sanitize_filename "$filename")
    if [ ${#sanitized_filename} -gt 220 ]; then
        sanitized_filename="${sanitized_filename:0:220}"
    fi
    cp "$file" "$destination_dir/$sanitized_filename"
done

dann nochmal aufgefordert alles als Einzeiler mit awk und sed:

1
find Quellverzeichnis/A -type f -exec sh -c 'cp "$0" "Zielverzeichnis/B/$(basename "$0" | iconv -c -f utf-8 -t ascii//TRANSLIT | sed "s/[^a-zA-Z0-9._-]//g" | cut -c -220)"' {} \;

werde das austesten und bescheid geben wie es läuft

Antworten |