2017-08-15 4 views
-2

Ich möchte Dateien in einem Ordner unter UNIX mit einem Skript umbenennen.
Das Format der Originaldatei ist:Unix umbenennen von Dateien

abc.txt.temp

und ich möchte es umbenennen:

abc.txt

Viele Dateien dieses Format verwenden, und ich möchte .temp entfernen aus dem ursprünglichen Dateinamen.

+0

Show 'die prename' Ausgabe – RomanPerekhrest

+0

Sie könnten das' mmv' Werkzeug verwenden möchten: 'mmv "* .txt.temp" "# 1.txt"' –

+1

Mögliche doppelte von [Shell/Bash-Verknüpfung zum Massenumbenennen von Dateien in einem Ordner] (https://stackoverflow.com/questions/8416990/shell-bash-shortcut-for-bulk-renaming-of-files-in-a-folder) – Fabien

Antwort

2

Die Antwort gab Ciprian ist sicherlich eine Option, aber ich glaube, es ist begrenzt. Die folgende Lösung ist viel flexibler, da Sie nichts zählen müssen und Sie können Text von jeder Position entfernen, anstatt nur das Ende.

Der folgende Befehl (1 Zeile) wird jegliche Erwähnung von .temp in allen Dateien entfernen:

for filename in *; do mv "$filename" "${filename//.temp/}"; done 

Hinweis Die "*" bedeutet, dass alle Dateien im aktuellen Verzeichnis. Sie können * .temp verwenden, um genau das gleiche Ergebnis zu erzielen wie Ciprians Methode. (das heißt nur .temp aus Dateien entfernen, die mit .temp enden)

+0

funktioniert gut. Ich konnte eine Reihe von Dateien schnell umbenennen. in einem 1-Liner !! – Ritesh

+0

Ich bin froh, dass ich helfen konnte! Ich habe diesen Befehl viel selbst verwendet und habe immer die Ergebnisse erhalten, die ich suchte :) Überlegen Sie, meine Antwort als "akzeptiert" zu markieren, so wird es oben angezeigt, damit andere Leute die Antwort schneller finden können. –

+0

für den Dateinamen in $ *; do mv "$ filename" "$ {filename //. temp /}"; Das funktioniert gut. Aber das wird mühsam, wenn ich sagen will, 100 Dateien und nur eines bestimmten Datums. gibt es eine Möglichkeit, dass ich nur date mit dem Skript als Parameter übergebe und Dateien dieses Datums nur umbenenne, ohne dass ich die Dateinamen weitergeben muss – Ritesh

-1

Erstellen Sie das folgende Skript mit einem Namen wie 'rename.sh':

#!/bin/bash 

TARGET_DIR=$1 
TARGET_FILES="$TARGET_DIR/*.temp" 

for fileName in $TARGET_FILES 
do 
    newFileName=${fileName::-5} 
    mv -v "${fileName}" "${newFileName}" 
done 

note Die ${var:offset:length} Expansion bash Version 4 oder höher benötigt.

Geben Sie ihm die Ausführungsrechte:

chmod a+x rename.sh 

Sie müssen es nennen und den Namen des Verzeichnisses der .temp Dateien als Parameter übergeben. Nennen Sie es wie folgt aus:

./rename.sh /path/to/the/temp-files 

Das Skript-Schleifen über alle * .temp Dateien im Zielordner, extrahiert die letzten 5 Zeichen aus dem Dateipfad (‚.temp‘ ist 5 Zeichen) und verschiebt die Originaldatei zu der neuen Datei, die .temp nicht als Erweiterung enthält.

EDIT: auf einem CentOS getestet 7

+0

substring Ausdruck <0 Fehler – Ritesh

+0

@Ritesh, ich habe den MV-Befehl ausführlich Modus hinzugefügt. Bitte modifiziere das Skript und führe es erneut aus. Beachten Sie die Option -v für den Befehl mv. Danach zeigen Sie bitte die Ausgabe an. Ich vermute ein Problem mit dem Dateinamen, aber wir müssen genau sehen, was das ist. –

+0

Könnte mit :: - :) zu tun haben –

1

Ich weiß nicht über UNIX, aber da die Frage auch das Linux-Tag hat, kann es sich nur um eine UNIX/Linux-Verwirrung handeln. Die meisten GNU/Linux-Distributionen verfügen über einen rename-Befehl.Je nach rename Version zu ersetzen, foo mit bar in files Namen die Syntax entweder so einfach sein kann als

rename foo bar files 

oder sed ‚s regexp-Syntax folgen:

rename 's/foo/bar/' files 

In Ihrem Fall, Sie wollen Ersetzen Sie .temp durch eine leere Zeichenfolge ('') in allen Dateien mit der Endung .temp, abhängig von Ihrer rename Version sollte einer dieser Befehle funktionieren:

rename .temp '' *.temp 

oder

rename 's/\.temp$//' *.temp