Entfernen von Erweiterungen in Unterverzeichnissen
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:
-
Sed und finden
-
Rubin
-
Python
My Poor Versuchen:
$find . -maxdepth 2 -name "*.tex" -ok mv `sed 's@.tex@@g' {}` {} +
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