Es sedist 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 . filejpgzu file.jpgdiesem Zweck , verwenden:
find . -name '. *' -print0 | while read -d $'\0' file; do short_file=${file%jpg}.jpg; mv "$file" "${short_file:4}"; done
Erläuterung
findist 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 tun find . -name "*.jpg". Normalerweise wird jede Datei in einer neuen Zeile ausgegeben. Das -print0macht 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 den readBefehl innerhalb der whileSchleife.
Der readBefehl wird verwendet, um die Ausgabe von zu übernehmen findund einer Variablen zuzuweisen file. Normalerweise würde dies filejedem 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 Dateien findmithilfe des -print0Flags).
Die while-Schleifen bewirken read, dass "Datei" für jeden übereinstimmenden Dateinamen iterativ Werte zugewiesen werden. Die dound donesind Teil der Standard-Bash-Syntax für eine while-Schleife:
while <something is true>; do
<run some commands>
done
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 . filejpgan . file.jpg. Anschließend wird mvdie Datei umbenannt, wobei der .am Anfang des erweiterungskorrigierten Dateinamens entfernte Dateiname entfernt wird : mv "$file" ${short_file:2}.