Frage

Ich brauche die Erweiterung ".tex" zu entfernen:

./1-aoeeu/1.tex
./2-thst/2.tex
./3-oeu/3.tex
./4-uoueou/4.tex
./5-aaa/5.tex
./6-oeua/6.tex
./7-oue/7.tex

Bitte, tun Sie es mit einigen Werkzeugen unter:

  1. Sed und finden

  2. Rubin

  3. Python

My Poor Versuchen:

$find . -maxdepth 2 -name "*.tex" -ok mv `sed 's@.tex@@g' {}` {} +
War es hilfreich?

Lösung

Ein Python-Skript tun das gleiche:

import os.path, shutil

def remove_ext(arg, dirname, fnames):
    argfiles = (os.path.join(dirname, f) for f in fnames if f.endswith(arg))
    for f in argfiles:
        shutil.move(f, f[:-len(arg)])

os.path.walk('/some/path', remove_ext, '.tex')

Andere Tipps

Eine Möglichkeit, die nicht unbedingt die schnellste (aber zumindest am schnellsten entwickelten):

    pax> for i in *.c */*.c */*/*.c ; do
    ...> j=$(echo "$i" | sed 's/\.c$//')
    ...> echo mv "$i" "$j"
    ...> done

Es ist äquivalent, da Ihr maxdepth ist 2. Das Skript nur hallt den mv Befehl zur Zeit (zu Testzwecken) und arbeitet an C-Dateien (da ich keine tex Dateien hatte mit testen).

Sie können aber mit aller Macht finden, benutzen also:

    pax> find . -maxdepth 2 -name '*.tex' | while read line ; do
    ...> j=$(echo "$line" | sed 's/\.tex$//')
    ...> mv "$line" "$j"
    ...> done

Mit "für i in" kann "zu viele Parameter" errrors verursachen

Ein besserer Ansatz ist mit dem Rohr auf den nächsten Prozess finden.

Beispiel:

find . -type f -name "*.tex" | while read file
do
    mv $file ${file%%tex}g
done

(Hinweis: Wont für Dateien mit Leerzeichen)

Mit bash, find und mv von Ihrem Basisverzeichnis.

 for i in $(find . -type f -maxdepth 2 -name "*.tex"); 
 do 
    mv $i $(echo "$i" | sed 's|.tex$||'); 
 done

Variation 2 basierend auf anderen Antworten hier.

find . -type f -maxdepth 2 -name "*.tex" | while read line; 
do 
   mv "$line" "${line%%.tex}";  
done

PS: Ich habe nicht die Rolle bekommen zu entkommen '.' von pax ...

Es gibt eine ausgezeichnete Perl-Skript umbenennen, die Schiffe mit einigen Distributionen, und sonst hat man es auf dem Netz finden können. (Ich bin nicht sicher, wo es offiziell residiert, aber das ist es ) . Überprüfen Sie, ob Ihre Umbenennungs von Larry Wall (Autor Abschnitt man rename) geschrieben wurde. Es wird Ihnen so etwas wie:

find . [-maxdepth 2] -name "*.tex" -exec rename 's/\.tex//' '{}' \;

-exec Verwendung ist hier einfachsten da gibt es nur eine Aktion auszuführen, und es ist nicht zu teuer mehrfach umbenennen aufzurufen. Wenn Sie mehrere Dinge tun müssen, verwenden Sie die „while read“ Form:

find . [-maxdepth 2] -name "*.tex" | while read texfile; do rename 's/\.tex//' $texfile; done

Wenn Sie etwas haben, wollen Sie nur einmal aufgerufen werden:

find . [-maxdepth 2] -name "*.tex" | xargs rename 's/\.tex//'

Die letzten macht deutlich, wie nützlich Umbenennungs ist -. Wenn alles ist schon an der gleichen Stelle, haben Sie einen schnellen regexp Renamer bekommen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top