Untergeordnetes Verzeichnis nicht umbenennen, wenn übergeordnetes Verzeichnis umbenannt wird

Untergeordnetes Verzeichnis nicht umbenennen, wenn übergeordnetes Verzeichnis umbenannt wird

Mein Verzeichnisbaum sieht wie folgt aus -

/media/blueray/Data/Test$ tree
.
├── What????
│   └── What????
└── What????.txt

Wenn ich den Befehl ausführefind . -depth | rename 's/[?<>\\:*|\"]//g'

Es sagt -

Can't rename ./What????/What???? ./What/What: No such file or directory

Nach dem Ausführen des Befehls wird die Verzeichnisstruktur jedoch zu -

/media/blueray/Data/Test$ tree
.
├── What
│   └── What????
└── What.txt

Mir scheint, dass er findvon der Spitze des Baums aus mit der Suche beginnt und deshalb den Überblick über den Baum verliert.

Was ist hier die Lösung?

Antwort1

Das Problem wird nicht durch verursacht find, sondern durch rename: Es verarbeitet den vollständigen Pfad und versucht daher, ./What????/What????in umzubenennen ./What/What, was fehlschlägt, da das WhatVerzeichnis (noch) nicht existiert.

Wenn Sie renamemit nur die Verarbeitung von Dateinamen durchführen, -dwird das folgende Problem behoben:

find . -depth | rename -d 's/[?<>\\:*|\"]//g'

Wenn Ihre Version von renamedie Option nicht unterstützt -d(eingeführt mit Version 1.10 von File::Rename, vorausgesetzt, Sie renameverwenden die Perl-Version), können Sie finddie Dateinamen nur übergeben, indem Sie renamein jedem Verzeichnis Folgendes ausführen:

find . -depth -execdir rename 's/[?<>\\:*|\"]//g' {} +

(Dank anFreddyfürdie Lösung.)

verwandte Informationen