Bash-Skript zum rekursiven Umbenennen oder Entfernen von Satzzeichen (? !) und Zeichenfolgen in Dateinamen von Dateien, Unterverzeichnissen und Verzeichnissen in Ubuntu 16.04

Bash-Skript zum rekursiven Umbenennen oder Entfernen von Satzzeichen (? !) und Zeichenfolgen in Dateinamen von Dateien, Unterverzeichnissen und Verzeichnissen in Ubuntu 16.04

Ich bin neu in der Verwendung von Bash-Skripten, habe aber einige Lösungen entdeckt, die damit den Dateinamen für Dateien in Verzeichnissen und Unterverzeichnissen in Ubuntu 16.04 entfernen oder umbenennen. Meine Dateistruktur ist beispielsweise unten dargestellt. Das FolderFruit,,,ist also der Dateiname unserer Hauptverzeichnisse. SubFolderApple???. SubFolder!!!Kiwi und SubFolder_Food_Bananasind die Dateinamen unserer Unterverzeichnisse. ListAppleFood, ListKiwiFood, und ListBananasind die Dateinamen unserer einzelnen Dateien.

>FolderFruit,,,
>>   SubFolderApple??
>>>      ListAppleFood.txt
>>   SubFolder!!Kiwi
>>>      ListKiwiFood.pdf
>>   SubFolder_Food_Banana
>>>      ListBanana.csv

Das Ziel besteht darin, die obigen Dateinamen wie unten gezeigt zu ändern, indem sämtliche Satzzeichen (z. B. ? und !) und die Zeichenfolge „Food“ entfernt werden, die in diesen Dateinamen vorkommen.

>FolderFruit
>>   SubFolderApple
>>>      ListApple.txt
>>   SubFolderKiwi
>>>      ListKiwi.pdf
>>   SubFolderBanana
>>>      ListBanana.csv

Bisher habe ich es geschafft, es wie unten beschrieben zu skripten, aber es funktioniert nicht. Daher würde ich gerne Hilfe von erfahrenen Bash- oder Linux-Benutzern bekommen.

shopt -s globstar for f in ./**; do sed 's/\([[:punct:]]\)/\\\1/g' "$f" done

Antwort1

Anstelle einer for-Schleife können Sie findwith verwenden -execdir:

$ find -depth -mindepth 1 -type f,d -execdir \
  rename 's/((Sub)?Folder|Food|List|[_,!?])//g' {} \;

Wenn ich den Kommentar näher ausführen möchte: Beim Umbenennen wird kein Unterschied zwischen Dateien und Verzeichnissen gemacht, was es exponentiell schwieriger macht (die .ext-Datei beizubehalten). In diesem Fall halte ich es für besser, den Prozess in zwei Schritte aufzuteilen und Dateien und Verzeichnisse separat zu verarbeiten.

$ find -mindepth 1 -depth \
   \( -type f -execdir rename 's/(List|Food|[[:punct:]])(?![^.]*$)//g' {} \; \) \
-o \( -type d -execdir rename 's/((Sub)?Folder|Food|[[:punct:]])//g' {} \; \)

Die beiden Befehle machen im Grunde dasselbe, außer dass der zweite Punkte verarbeiten kann.

verwandte Informationen