Benennen Sie mehrere Dateien und Unterverzeichnisse um und fügen Sie an bestimmten Stellen unter OSX Zeichen ein

Benennen Sie mehrere Dateien und Unterverzeichnisse um und fügen Sie an bestimmten Stellen unter OSX Zeichen ein

Ich habe Dateien und Verzeichnisse, die beginnen mit"Kategorie-Symbol-"in vielen Unterverzeichnissen. Ich versuche, sie rekursiv umzubenennen in"Kategorie-Symbole-". Bitte beachten Sie, dass ich fehlende"G"zumKategorieUnd"S"am Ende vonSymbole.

Ich habe mir jede Menge anderer Fragen zum Umbenennen mehrerer Dateien und Verzeichnisse angesehen, konnte aber keine davon zum Laufen bringen!

Ich wäre für eine kleine Erklärung der Antwort sehr dankbar.

BEARBEITET: Hier ist ein Beispiel meiner Verzeichnisstruktur:

test/cateory-icon-archery/cateory-icon-archery.png
                          [email protected]

test/cateory-icon-automotive/cateory-icon-automotive.png
                             [email protected]

Antwort1

Da Sie dies rekursiv tun müssen, findist dies das beste Werkzeug. Um den Namen zu ändern, können Sie shim -execAufruf verwenden. Hier ist ein Beispiel:

find /some/path -name 'cateory-icon' -exec sh -c 'mv "$1" "${1%/*}/category-icon-${1#cateory-icon-*}"' -- {} \;

Die ${1#cateory-icon-*}Erweiterung erhält den Dateinamen danach cateory-icon.

Antwort2

Geben Sie in zsh Folgendes ein .zshrc(oder führen Sie es einmalig in der Befehlszeile aus):

autoload zmv
alias zcp='zmv -C'
alias zln='zmv -L'

DerzmvFunktionkombiniert mit zsh'sPlatzhalter und Globbing-Funktionenermöglicht einfaches Umbenennen und Kopieren von Dateien. Hier sind mehrere Möglichkeiten, das gewünschte Ergebnis zu erzielen:

zmv '(**/)cateory-icon-(*)' '${1}category-icons-$2'
zmv -w '**/cateory-icon-*' '${1}category-icons-$2'
zmv '**/cateory-icon-(*)' '$f:h/category-icons-$1'

Erklärung einiger zsh-Funktionen:

  • **/gleicht Dateien in Unterverzeichnissen rekursiv ab.
  • Klammern im Quellausdruck kennzeichnen Gruppen. $NUModer ${NUM}werden im Ersetzungsausdruck durch den Teil des Originalnamens ersetzt, der in der NUM-ten Gruppe enthalten ist.
  • Klammern **sind etwas eigenartig: Sie können sie nur um das Wort herum setzen **/, nicht mehr und nicht weniger.
  • Die -wOption zmvfügt jedes Platzhalterzeichen automatisch einer Gruppe hinzu (bei **ist dies der **/Teil, der sich in einer Gruppe befindet, mit dem abschließenden /).
  • $fbeim Ersetzen ist der vollständige Quelldateiname gemeint.
  • $VAR:hbedeutet den Verzeichnisteil von $VAR. Dies ist normalerweise $VARbis zum letzten /, aber alle Randfälle ( foo, foo/, /, …) werden korrekt behandelt. Der Basisname ist verfügbar als $VAR:t.

Antwort3

Verwenden von Perl für maximale Portabilität:

#!/usr/bin/env perl

use strict;
use warnings;
use File::Find;
use File::Copy qw(move);

my $new_name;
finddepth( sub { 
                 if(/cateory-icon/){
                     ($new_name = $File::Find::name) =~ s{.*/\Kcateory-icon}{category-icons};
                     move $File::Find::name => $new_name;
                 }
           },
          '.')

Erläuterung

  • Hierbei kommen zwei Perl-Kernmodule zum Einsatz: File::Findeines zum rekursiven Durchlaufen von Verzeichnisbäumen und File::Copyeines zum rekursiven Kopieren/Verschieben von Verzeichnissen.
  • Die finddepthFunktion (von File::Find) durchläuft die Liste der Verzeichnisse, die als zweites Argument angegeben ist ( .in diesem Fall ist dies das aktuelle Verzeichnis; ändern Sie es nach Bedarf).
  • Das erste Argument finddepthist eine Subroutinenreferenz, die finddepthbeim Durchlaufen des Baums für jede angetroffene Datei ausgeführt wird.
  • Wir starten diese Subroutine mit einer ifBedingung: Wenn der übereinstimmende Dateiname das Muster enthält , bilden wir den neuen Namen, indem wir die erforderlichen Korrekturen vornehmen und die Funktion (von ) cateory-iconverwenden, um den aktuellen Namen in den neuen Namen zu ändern.moveFile::Copy

Haftungsausschluss

Dieser Code ist ungetestet. Probieren Sie ihn zunächst an einem Dummy-Verzeichnisbaum aus!

verwandte Informationen