ubuntuusers.de

Wie Dateinamen kürzen (mit find)?

Status: Gelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

UlfZibis

Anmeldungsdatum:
13. Juli 2011

Beiträge: 3162

Wohnort: Köln

Hallo, ich habe hier einige Ordner nach dem Muster:

ABC-E-F

Die möchte ich kürzen in:

E-F

(also alles bis zum ersten '-' soll weg) Nun habe ich mir dafür folgenden Befehl ausgedacht:

find . -depth -execdir variable="{}" && mv $variable ${variable#*-} \;

Der geht nicht, denn schon der erste Teil scheitert:

$ find . -depth -exec variable="{}" \;
find: ‘variable=./9d19b5bdb899c7e8f4243e331bb57861-MEM-agile-cologne/files.zip’: Datei oder Verzeichnis nicht gefunden
find: ‘variable=./9d19b5bdb899c7e8f4243e331bb57861-MEM-agile-cologne/links.zip’: Datei oder Verzeichnis nicht gefunden

Also das Setzen einer Variablen klappt schon mal nicht. Was mache ich da falsch?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

UlfZibis schrieb:

Hallo, ich habe hier einige Ordner nach dem Muster:

ABC-E-F

Die möchte ich kürzen in:

E-F

(also alles bis zum ersten '-' soll weg) Nun habe ich mir dafür folgenden Befehl ausgedacht:

find . -depth -execdir variable="{}" && mv $variable ${variable#*-} \;

Der geht nicht, denn schon der erste Teil scheitert:

$ find . -depth -exec variable="{}" \;
find: ‘variable=./9d19b5bdb899c7e8f4243e331bb57861-MEM-agile-cologne/files.zip’: Datei oder Verzeichnis nicht gefunden
find: ‘variable=./9d19b5bdb899c7e8f4243e331bb57861-MEM-agile-cologne/links.zip’: Datei oder Verzeichnis nicht gefunden

Also das Setzen einer Variablen klappt schon mal nicht. Was mache ich da falsch?

Du musst eine Shell aufrufen, damit Du Variablen setzen kannst. Selbst, wenn der erste Teil funktionieren würde, könntest Du nicht mit && weiter machen, weil die Shell das interpretiert.

So sollte es gehen:

1
2
3
4
5
6
7
8
find -depth -type d -exec sh -c '
for dir; do
  dir_name=$(dirname "$dir")
  base=${dir##*/}
  target=$dir_name/${base#*-}"
  test -d "$target" || mv "$dir" "$target"
done
' -- {} +

UlfZibis

(Themenstarter)

Anmeldungsdatum:
13. Juli 2011

Beiträge: 3162

Wohnort: Köln

rklm schrieb:

So sollte es gehen:

1
2
3
4
5
6
7
8
find -depth -type d -exec sh -c '
for dir; do
  dir_name=$(dirname "$dir")
  base=${dir##*/}
  target=$dir_name/${base#*-}"
  test -d "$target" || mv "$dir" "$target"
done
' -- {} +

Ui, gar nicht so einfach. Bin ja immer wieder erstaunt, dass es für so scheinbar alltägliche Aufgeben keine einfachen Lösungen gibt. Wie wäre es denn mit:

find . -depth -type d -execdir rename -v 's/Alt/Neu/' {} +

Da hätte ich dann gerne einen Tipp, was ich da dann für Alt und Neu einsetzen muss.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

UlfZibis schrieb:

Ui, gar nicht so einfach.

Für mich ging es schneller, als die Varianten mit rename rauszufriemeln.

Bin ja immer wieder erstaunt, dass es für so scheinbar alltägliche Aufgeben keine einfachen Lösungen gibt.

Liegt nur daran, dass ich nie rename nutze.

Wie wäre es denn mit:

find . -depth -type d -execdir rename -v 's/Alt/Neu/' {} +

Da hätte ich dann gerne einen Tipp, was ich da dann für Alt und Neu einsetzen muss.

Das müsste dann so etwas sein:

1
find -depth -type d -execdir rename -v 's/^[^-]*-//' {} +

Man könnte noch ein paar Aufrufe von rename sparen, wenn man -exec nimmt. Aber dann muss der Ausdruck etwas angepasst werden, da der Pfad länger wird, den rename sieht:

1
find -depth -type d -exec rename -v 's#^(.*/)[^-/]*-([^/]*)$#$1$2#' {} +

Anm besten erst mal mit "-n" statt "-v" ausprobieren.

UlfZibis

(Themenstarter)

Anmeldungsdatum:
13. Juli 2011

Beiträge: 3162

Wohnort: Köln

rklm schrieb:

1
find -depth -type d -execdir rename -v 's/^[^-]*-//' {} +

Vielen Dank, hat super funktioniert!

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

In solchen Fällen arbeite ich gerne mit ad-hoc-Scripts (hier zum Testen erst mal mit echo, statt dem scharfen Kommando):

1
2
echo 'name="$1"; echo mv ${name} ${name#*-}' > adhoc.sh 
find -type d -name "*-*" -exec bash adhoc.sh {} ";"

Braucht man das Script häufiger macht man natürlich einen hübschen Shebang rein, macht es ausführbar und ruft es direkt auf, verschiebt es in sein bin-Dir, damit es im PATH verfügbar ist ...

Antworten |