Gibt es eine schnelle Möglichkeit, einen Teil eines Dateinamens in jeder Datei und jedem Ordner in einer Sammlung verschachtelter Ordner ein paar Ebenen tief zu ändern?

377
Kirt

Windows oder Linux funktioniert entweder auf einem externen Laufwerk, das entweder gelesen werden kann

zB "Version2" in "Datei3" in jeder Datei und jedem Ordner eines Projekts ändern?

In diesem Fall möchte ich jedoch die Initialen des Patienten in "patient-1" in jedem Dateinamen und Ordnernamen ändern. Dutzende bis Hunderte von Dateien, Dutzende von Gigabytes und etwa 10 Patienten (zehn verschiedene Dinge zum Ändern).

1

2 Antworten auf die Frage

0
Mureinik

In Linux würde ich findalle relevanten Dateien suchen und dann rename:

$ find . -name "*version2*" -exec rename version2 version3 {} \; 

BEARBEITEN:
Um zu verdeutlichen, bezieht sich diese Lösung gemäß dem nachstehenden Kommentar von @ choroba auf die Umbenennung (1), die als Teil des util-linux-Pakets verteilt wird.

Beachten Sie, dass es zwei verschiedene Umbenennungsbefehle mit völlig unterschiedlicher Bedeutung der Argumente gibt. choroba vor 7 Jahren 2
Was ist, wenn es nur ein Teil des Dateinamens ist? dh "JS-sample2.txt" bis "patient1-sample2.txt" Kirt vor 7 Jahren 0
0
Kirt

an answer i got from elsewhere, but i haven't tried it and i don't know if it's optimal:

"This isn't as elegant as I hoped but it changes "-kr" to "-patient-123" on the end of "*.txt" files"

find . -type f -iname '*.txt' | perl -ne 'chomp; my $orig = $; if (s/-kr(.txt)$/-patient-123$1/) { print "$orig\0$\0"; }' | xargs -0rn2 mv -i

"it only does filenames, the folders can be done separately like this:"

find . -type d | tac | perl -ne 'chomp; my $orig = $; if (s/-kr$/-patient-123/) { print "$orig\0$\0"; }' | xargs -0rn2 mv -i