So entfernen Sie Punkte und Leerzeichen vom Anfang der Dateinamen

8

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 . StartjpgzuStart.jpg

Der Punkt macht die Dateien versteckt aus sedund ls -allistet die Dateien , so dass ich kochend ls -alan 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

user251046
quelle
Ich habe 4 Stunden dafür verbracht: / Es könnte nur eine Minute für Sie
dauern
Sie sagen , Sie sind auch zu ändern versuchen , filejpgzu file.jpg. Was versuchst du überhaupt zu tun?
Dr.
@drs Ich versuche, eine Reihe von . filejpgDateien infile.jpg
user251046
Es gibt einen renameoder- prenameBefehl (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 genannt renamewird. Es ist viel weniger leistungsfähig.
Derobert
@ user251046, geben Sie uns die genaue Eingabe und die genaue Ausgabe. Lassen Sie uns auch wissen, was Sie versuchen, indem Sie Ihre Frage bearbeiten.
Ramesh

Antworten:

9

Mit dem Perl- renameTool (das renamebei Debian und Freunden, einschließlich Ubuntu, aufgerufen wird , kann es prenameanderswo sein):

rename -n 's/(?<!\.)jpg$/.jpg/' *  # -n makes it show you what it'll do,
                                   # but not actually do it. Remove the -n to
                                   # actually rename

Um dieses Muster aufzubrechen: Das jpg$Mittel "endet mit 'jpg'". Das (?<!\.)bedeutet ‚es ist kein Punkt vor diesem‚jpg‘“. Das verhindert , dass Sie Ändern foo.jpgin foo..jpg, das albern wäre.

Dies *ist der normale Shell-Platzhalter. renamenimmt eine Liste von Dateien, die umbenannt werden sollen. Sie können natürlich /path/to/dir/*eine Liste von Dateinamen übergeben, in Verbindung mit findusw. verwenden.

Das Entfernen von Punkten und Leerzeichen von Anfang an ist ebenfalls recht einfach:

rename -n 's/^[. ]+//' *          # trying -n first is good practice

Dadurch werden alle Punkte und Leerzeichen am Anfang entfernt. Es wird sich . . . fooin verwandeln foo.

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 mit jpg). Der zweite Befehl versucht, sie umzubenennen, aber das sollte nur einen Fehler erzeugen. Eine Alternative ist find:

find -type f -exec rename -n 's/^[. ]+//' '{}' +

-type fwird auf nur Dateien beschränkt. Sie können natürlich auch alle anderen Optionen von find verwenden.

derobert
quelle
Die -nOption listet nichts auf und ohne sie wird leider nichts umbenannt. Ich denke, das liegt daran, dass die Dateien darin versteckt sind.
user251046
@ user251046 versuche es mit .*statt *. Das wird dazu führen, dass die speziellen Einträge .und ..auch übergeben werden, aber diese sollten ignoriert werden.
Derobert
Wie hast du das alles gelernt? Du bist fantastisch! Vielleicht kannst du mir zeigen, wo du das herausgefunden hast? Außerdem habe ich jetzt eine Datei mit dem Namen IMG_32347. Wie füge ich .jpg hinzu?
user251046
@ user251046 Wenn es sich um eine Datei handelt, ist dies bei weitem der einfachste Weg 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.
Derobert
Vielen Dank für Ihre Antwort, ich weiß, ich kann nur mv tun, aber ich frage, weil dies nützlich zu wissen ist. Dies ist, was ich gerade versucht habe (und fehlgeschlagen bin)rename -n 's/(?<!\.flac)/.flac\$/' *
user251046
4

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}.

drs
quelle
Wie benenne ich dann um?
user251046
Können Sie bitte erklären, wie dieser "Einzeiler" funktioniert?
user251046
Abstimmung erfordert 15 Ruf
Benutzer251046
Vielen Dank für Ihre gründliche Erklärung. *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 ?
user251046
Sie können nur eine Antwort auf jede Frage auswählen. Deroberts Antwort ist etwas sauberer, daher ist es wahrscheinlich besser, sie als die ausgewählte zu belassen.
Dr.
0

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.

AL
quelle