Wie man Dateien umbenennt, indem Sonderzeichen entfernt werden, ohne die Linux-Shell umzubenennen

2096
chenyi1976

Ich habe zum Beispiel 100 Dateien und alle Namen haben Leerzeichen. Einer von ihnen ist " The Monkey King Return (2015).mkv".

Wie entferne ich alle Leerzeichen im Namen und ersetze sie mit Punktzeichen, entferne auch "(" und ")"?

Das Ergebnis sollte " The.Monkey.King.Return.2015.mkv" sein.

wie kann ich das im Batch machen?

Ich führe eigentlich Shell-Skript in meinem Synology NAS über ssh aus. Hierbei handelt es sich um eine BusyBox-Linux-Distribution mit installiertem bash und ash, ohne gcc. Bereits an mehreren Tagen versucht, kann es nicht richtig herausfinden.

Tools zur Verfügung: mv / xargs / sed / awk / andere standard linux cmd.

Wie wäre es auch mit der Umbenennung für Unterordner?

Edit: habe gerade apt-get installiert und cmd in meine Synology nas umbenannt, indem Sie Debian Chroot von https://synocommunity.com/ verwenden, also ist es jetzt in Ordnung .

Um eine Person zu finden, die eine einfache Antwort benötigt, lautet das cmd:

find . -iname \*\ \*.\*|rename 's/\ /\./g' 
0
Mögliches Duplikat von [Wie benenne ich Dateien mit Leerzeichen mit der Linux-Shell um?] (Http://superuser.com/questions/295994/how-do-i-rename-files-with-spaces- using-the-linux- Schale) Anthony Geoghegan vor 7 Jahren 3

3 Antworten auf die Frage

2
Sjon

Wenn Sie den renameBefehl nicht haben, können Sie dies mit einem kleinen Shell-Scripting tun, das ashauch von busybox unterstützt wird (dies ist rekursiv):

find -type f -name \*.mkv | while read f; do n=$ # replace spaces n=$ # remove opening bracket n=$ # remove closing bracket  mv -v "$f" "$n" done 

Bitte beachten Sie, dass dies zu Bruch führt, wenn die Ordnernamen auch Leerzeichen oder Klammern enthalten.

1
Sjon

Die meisten Linux-Distributoren enthalten util-linux, das Ihnen den renameBefehl gibt. Sie können tun, was Sie anfordern, indem Sie diese Befehle ausführen:

rename ' ' _ *.mkv rename '(20' 20 *.mkv rename ').' . *.mkv 

Sie können mit den Optionen experimentieren, es ist ziemlich flexibel. Wenn Sie dies rekursiv durchführen möchten, kombinieren Sie renameden Befehl find wie folgt:

find . -type f -name \*.mkv -exec rename ' ' _ {} \; 

Diese werden im Handbuch erklärt. tippen man findoder man renamelesen.


Beachten Sie, dass einige Distributionen anscheinend einen anderen Befehl enthalten, der reguläre Perl-Ausdrücke akzeptiert. Wenn Ihre auch dies tut, benötigen Sie eine etwas andere Syntax:

rename 's/\ /./g' *.mkv rename 's/[\)\(]//g' *.mkv 
In acht nehmen! Zumindest, wenn yours das gleiche wie meins ist, nimmt "rename" einen regulären Ausdruck ein, und in einem regulären Ausdruck entspricht "." Einem * beliebigen * einzelnen Zeichen. a CVn vor 7 Jahren 0
Nun, meiner tut dies nicht und die Manpage bestätigt dies mit dem folgenden Beispiel: `Umbenennen von .htm .html * .htm`. Aber ich füge die Warnung hinzu, danke Sjon vor 7 Jahren 0
Ich führe tatsächlich ein Shell-Skript in meinem Synology NAS über ssh aus, das leider keinen Befehl zum Umbenennen hat. Kann ich dies mit dem Befehl mv tun? chenyi1976 vor 7 Jahren 0
@ chenyi1976 hast du bash installiert? Schreiben Sie Ihre Einschränkungen in Ihrer Frage auf Sjon vor 7 Jahren 0
Ticket aktualisiert, es ist eine BusyBox Linux-Distribution mit bash und ash, ohne gcc. chenyi1976 vor 7 Jahren 0
@Sjon eine Sache finde ich heraus, dass ein System wie die Synologie die Syntax von sed tatsächlich verwendet: "Rename's / \ /\./g '* .mkv" chenyi1976 vor 7 Jahren 0
0
ScriptKitty37

Ich habe seit einiger Zeit nach einer Lösung für dieses Problem gesucht. Ich arbeite mit alten geschlossenen Systemen, auf denen keine neuen Pakete installiert werden können. Ich habe keinen renameBefehl. Schließlich habe ich ein Skript geschrieben, das mit allen über die Tastatur eingegebenen Sonderzeichen zu funktionieren scheint:~@#$%^&*()-_=+[]{}\|;:",<.>?'

Das Skript benennt alle Dateien und Verzeichnisse im aktuellen Verzeichnis um. Es werden alle Sonderzeichen außer -_.dem _Zeichen ersetzt. Dasoutfile= Zeile kann geändert werden, um bei Bedarf ein anderes Zeichen zum Ersetzen zu verwenden. Ersetzen Sie |_|mit |.|, um beispielsweise das .Zeichen zu verwenden.

#!/bin/bash  for file in ./* do infile=`echo "$"|sed \ -e 's|"\"|"\\"|g' \ -e 's| |\ |g' -e 's|!|\!|g' \ -e 's|@|\@|g' -e 's|*|\*|g' \ -e 's|&|\&|g' -e 's|]|\]|g' \ -e 's|}|\}|g' -e 's|"|\"|g' \ -e 's|,|\,|g' -e 's|?|\?|g' \ -e 's|=|\=|g' ` outfile=`echo "$"|sed -e 's|[^A-Za-z0-9._-]|_|g'` mv "$infile" $ & done  exit