Ich versuche zu ändern jpg - Dateien mit einem Punkt genannt und ein Leerzeichen am Anfang und mit einem fehlenden Punkt vor dem Ende (wie dies . Startjpg
zuStart.jpg
Der Punkt macht die Dateien versteckt aus sed
und ls -al
listet die Dateien , so dass ich kochend ls -al
an sed
. Ich habe viele Handbücher online gelesen und bekomme immer diesen Fehler
sed: -e expression #1, char 6: unknown command: `/'
ich habe es versucht
ls -al | sed -r '/^\./*.*/g'
ls -al | sed -r '/^\.//g'
ls -al | sed -r '/.*/[\.]g'
ls -al | sed 's/^\./\\1*./g'
und viele mehr und noch viel mehr viele mehr.
Außerdem muss ich filejpg in file.jpg ändern
shell
regular-expression
rename
user251046
quelle
quelle
filejpg
zufile.jpg
. Was versuchst du überhaupt zu tun?. filejpg
Dateien infile.jpg
rename
oder-prename
Befehl (Teil von Perl), der ein viel besseres Werkzeug für diesen Job ist. Beachten Sie, dass es ein Nicht-Perl-Umbenennungswerkzeug gibt, das manchmal auch genanntrename
wird. Es ist viel weniger leistungsfähig.Antworten:
Mit dem Perl-
rename
Tool (dasrename
bei Debian und Freunden, einschließlich Ubuntu, aufgerufen wird , kann esprename
anderswo sein):Um dieses Muster aufzubrechen: Das
jpg$
Mittel "endet mit 'jpg'". Das(?<!\.)
bedeutet ‚es ist kein Punkt vor diesem‚jpg‘“. Das verhindert , dass Sie Ändernfoo.jpg
infoo..jpg
, das albern wäre.Dies
*
ist der normale Shell-Platzhalter.rename
nimmt eine Liste von Dateien, die umbenannt werden sollen. Sie können natürlich/path/to/dir/*
eine Liste von Dateinamen übergeben, in Verbindung mitfind
usw. verwenden.Das Entfernen von Punkten und Leerzeichen von Anfang an ist ebenfalls recht einfach:
Dadurch werden alle Punkte und Leerzeichen am Anfang entfernt. Es wird sich
. . . foo
in verwandelnfoo
.Normalerweise
*
liefert die Shell-Erweiterung keine Dateien, deren Name mit einem Punkt beginnt (versteckte Dateien). Eine Option ist zu verwenden.*
; das ergibt auch die zwei speziellen Einträge.
(aktuelles Verzeichnis) und..
(übergeordnetes Verzeichnis). Das sollte in diesem Fall harmlos sein; Der erste Befehl ignoriert sie (sie enden nicht mitjpg
). Der zweite Befehl versucht, sie umzubenennen, aber das sollte nur einen Fehler erzeugen. Eine Alternative ist find:-type f
wird auf nur Dateien beschränkt. Sie können natürlich auch alle anderen Optionen von find verwenden.quelle
-n
Option listet nichts auf und ohne sie wird leider nichts umbenannt. Ich denke, das liegt daran, dass die Dateien darin versteckt sind..*
statt*
. Das wird dazu führen, dass die speziellen Einträge.
und..
auch übergeben werden, aber diese sollten ignoriert werden.mv IMG_32347 IMG_32347.jpg
. All dies habe ich durch die Verwendung von Linux seit über 15 Jahren und Perl noch länger gelernt.rename -n 's/(?<!\.flac)/.flac\$/' *
Es
sed
ist zwar ein sehr nützliches und vielseitiges Werkzeug, aber Sie verwenden es nicht richtig. Es wird am besten verwendet, um Zeichenfolgen in Textdateien abzugleichen und zu ersetzen. Dateien im Dateisystem können nicht direkt umbenannt werden.Diese Aufgabe ist besser für einen Bash-Einzeiler geeignet (vorausgesetzt, das ist Ihre Shell). So benennen Sie so etwas wie
. filejpg
zufile.jpg
diesem Zweck , verwenden:Erläuterung
find
ist ein Programm, das Pfade zu Dateien zurückgibt, die einer bestimmten Dateieigenschaft entsprechen, in diesem Fall dem Dateinamen. Wenn Sie nur wissen möchten, welche JPG-Dateien sich in den Unterverzeichnissen Ihres aktuellen Pfads befinden, würden Sie dies tunfind . -name "*.jpg"
. Normalerweise wird jede Datei in einer neuen Zeile ausgegeben. Das-print0
macht es stattdessen die Spiele mit einem Null - Zeichen zu trennen. Dies ermöglicht die ordnungsgemäße Behandlung von Dateinamen mit Leerzeichen, wenn die Ausgabe an die nächsten Befehle übergeben wird.Der
|
Charakter ist als Pipe bekannt. Es weist die Shell an, die Ausgabe des Befehls links zu übernehmen und als Eingabe an den Befehl rechts zu übergeben, in diesem Fall denread
Befehl innerhalb derwhile
Schleife.Der
read
Befehl wird verwendet, um die Ausgabe von zu übernehmenfind
und einer Variablen zuzuweisenfile
. Normalerweise würde diesfile
jedem Wort zu einem Zeitpunkt Werte zuweisen , aber dies-d $'\0'$
führt dazu, dass die Zuweisungen durch das Nullzeichen begrenzt werden (entsprechend der Begrenzung der Dateienfind
mithilfe des-print0
Flags).Die while-Schleifen bewirken
read
, dass "Datei" für jeden übereinstimmenden Dateinamen iterativ Werte zugewiesen werden. Diedo
unddone
sind Teil der Standard-Bash-Syntax für eine while-Schleife:In diesem Fall korrigiert unser Befehl "run some" zuerst die Erweiterung des Dateinamens und weist sie einer neuen Variablen zu:
short_file=${file%jpg}.jpg
Änderungen. filejpg
an. file.jpg
. Anschließend wirdmv
die Datei umbenannt, wobei der.
am Anfang des erweiterungskorrigierten Dateinamens entfernte Dateiname entfernt wird :mv "$file" ${short_file:2}
.quelle
*Normally this would assign values to file each word at a time, but the -d $'\0'$ causes the assignments to be delimited by the null character (matching how we delimited the files in find by using the -print0 flag).*
Ich verstehe diesen Teil nicht, obwohl er funktioniert. Wie kann ich ihn auch als meine akzeptierte Antwort auswählen ?Alternativ zu den anderen Antworten können Sie das grafische Tool GPRename verwenden . Es kann Zeichen ersetzen, Dateinamen abschneiden usw. Der Vorteil besteht darin, dass eine integrierte Vorschaufunktion vorhanden ist, mit der die neuen Dateinamen vor dem Umbenennen überprüft werden können. Da es jedoch jeweils in einem Verzeichnis funktioniert, ist es unpraktisch, es mit zahlreichen Ordnern in Unterordnern zu verwenden. Bei weniger als 10 Ordnern ist dies jedoch kein Problem.
quelle