staging.inyokaproject.org

1. Leerzeichen aus Dateinamen recursiv entfernen nur bei vorhandemen Leerzeichen

Status: Gelöst | Ubuntu-Version: Xubuntu 16.04 (Xenial Xerus)
Antworten |

goldirun

Avatar von goldirun

Anmeldungsdatum:
12. Januar 2013

Beiträge: Zähle...

Hallo Leute,

eventuell kann mir jemand auf die Sprünge helfen ☺

Habe einen Ordner mit vielen subfoldern in diesen liegen Dateien mit unterschiedlichsten Dateinamen.

Leider haben manche dieser Dateinamen ein Leerzeichen vorne angestellt.

Jetzt suche ich eine Möglichkeit recursive alle Dateinamen durch zu gehen und falls vorhanden das 1. Leerzeichen zu entfernen.

Habe zwar im Netzt einiges gefunden aber da geht es oft um das ersetzten aller Leerzeichen durch andere Symbole.

Der Dateiname darf weiterhin weitere Leerzeichen haben, nur das erste soll entfernt werden wenn eins vorhanden ist, falls keines vorhanden ignorieren und weiter.

Eventuell kann mir ja jemand verraten wie ich das lösen kann?

Grüße

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

1
2
3
4
5
for file in /Pfad/zu/Dateien do
  FILENAME="$(echo -e "${file}" | sed -e 's/^[[:space:]]*//')"
  echo "Alter Dateiname::$file::NeuerDateiname::$FILENAME"
  #mv "$file" "$FILENAME"  
done

Ungetestet! Das gibt erstmal nur aus, wie die Dateinamen aussehen würden. Falls das passt, kannst du den Kommentar von mv entfernen.

Als kurze Erklärung: echo -e erlaubt mit Backslash markierte Einträge wie

echo -e " pfad/zur/datei/mit\tTabstopp und \nZeilenumbruch"

sed -e nutzt eine RegEx, die am Dateianfang einen space durch nix (//) ersetzt.

goldirun

(Themenstarter)
Avatar von goldirun

Anmeldungsdatum:
12. Januar 2013

Beiträge: 52

Hi vielen Dank für die schnelle Antwort nur bekomme ich leider einen Syntaxfehler beim Aufruf. habe folgendes in eine rename.sh gepackt:

1
2
3
4
5
6
#!/bin/bash
for file in /home/xxx/xx/x/ do
  FILENAME="$(echo -e "${file}" | sed -e 's/^[[:space:]]*//')"
  echo "Alter Dateiname::$file::NeuerDateiname::$FILENAME"
  #mv "$file" "$FILENAME"  
done

dieses wiederum mit chmod +x rename.sh ausführbar gemacht und aufgerufen.

Dann bekomme ich aber leider:

1
2
3
xxx@dell:~$ ./rename.sh 
./rename.sh: Zeile 3: Syntaxfehler beim unerwarteten Wort »FILENAME="$(echo -e "${file}" | sed -e 's/^[[:space:]]*//')"«
./rename.sh: Zeile 3: `  FILENAME="$(echo -e "${file}" | sed -e 's/^[[:space:]]*//')"'

Habe schon versucht es zu Lösen aber steige irgendwie nicht durch was ihm nicht passt.

Grüße

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

1
2
3
4
5
6
7
find -depth -name ' *' -exec sh -c '
for f; do
  d=$(dirname "$f")
  b="${f##*/}"
  echo mv -v "$f" "$d/${b# }"
done
' -- {} +

Zum Ausführen das echo entfernen.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Oder mit rename:

1
find . -type f -execdir rename -n "s#/\s#/#"  {} \;

Damit tatsächlich Dateien umbenannt werden, das -n hinter rename entfernen oder durch ein -v ersetzen, wenn man sehen will, was umbenannt wird.

Edit: Befehl so abgeändert, dass zunächst nur simuliert wird.

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

goldirun schrieb:

#!/bin/bash
for file in /home/xxx/xx/x/* ;do
  FILENAME="$(echo -e "${file}" | sed -e 's/^[[:space:]]*//')"
  echo "Alter Dateiname::$file::NeuerDateiname::$FILENAME"
  #mv "$file" "$FILENAME"  
done

Da ich offenbar immernoch viel zu kompliziert arbeite, kannst du die Vorschläge der Kollegen nehmen. Die Info bezüglich des Fehlers ist etwas verwirrend, da der Fehler in Zeile 2 liegt und ich ein Semikolon vergessen habe.

goldirun

(Themenstarter)
Avatar von goldirun

Anmeldungsdatum:
12. Januar 2013

Beiträge: 52

Perfekt danke Leute,

hat funktioniert der rename einzeiler war am bequemsten!

Grüße und einen schönen Abend noch allen.

Antworten |