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_Banana
sind die Dateinamen unserer Unterverzeichnisse. ListAppleFood
, ListKiwiFood
, und ListBanana
sind 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 find
with 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.