Eliminar extensiones en subdirectorios
Pregunta
Necesito eliminar la extensión " .tex " ;:
./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
Por favor, hazlo con algunas herramientas a continuación:
-
Sed y encuentra
-
Ruby
Python
Mi pobre intento:
$find . -maxdepth 2 -name "*.tex" -ok mv `sed 's@.tex@@g' {}` {} +
Solución
Un script en Python para hacer lo mismo:
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')
Otros consejos
De una manera, no necesariamente la más rápida (pero al menos la más rápida desarrollada):
pax> for i in *.c */*.c */*/*.c ; do
...> j=$(echo "$i" | sed 's/\.c$//')
...> echo mv "$i" "$j"
...> done
Es equivalente ya que su maxdepth es 2. La secuencia de comandos solo está haciendo eco del comando mv
en este momento (para fines de prueba) y está trabajando en archivos C (ya que no tenía tex archivos para probar con).
O, puedes usar la búsqueda con todo su poder, por lo tanto:
pax> find . -maxdepth 2 -name '*.tex' | while read line ; do
...> j=$(echo "$line" | sed 's/\.tex$//')
...> mv "$line" "$j"
...> done
Usando " para i en " puede causar " demasiados parámetros " errrors
Un mejor enfoque es canalizar la búsqueda al siguiente proceso.
Ejemplo:
find . -type f -name "*.tex" | while read file
do
mv $file ${file%%tex}g
done
(Nota: no manejaremos archivos con espacios)
Usando bash
, find
y mv
desde su directorio base.
for i in $(find . -type f -maxdepth 2 -name "*.tex");
do
mv $i $(echo "$i" | sed 's|.tex$||');
done
Variación 2 basada en otras respuestas aquí.
find . -type f -maxdepth 2 -name "*.tex" | while read line;
do
mv "$line" "${line%%.tex}";
done
PS: No obtuve la parte sobre escapar de '.
' con pax
...
Hay una excelente secuencia de comandos de cambio de nombre de Perl que se envía con algunas distribuciones y, de lo contrario, puede encontrarla en la web. (No estoy seguro de dónde reside oficialmente, pero esto es todo ) . Compruebe si su cambio de nombre fue escrito por Larry Wall (sección AUTOR de man rename
). Te permitirá hacer algo como:
find . [-maxdepth 2] -name "*.tex" -exec rename 's/\.tex//' '{}' \;
El uso de -exec es más simple aquí porque solo hay una acción que realizar, y no es demasiado caro invocar renombrar varias veces. Si necesita hacer varias cosas, use la tecla " mientras lee " forma:
find . [-maxdepth 2] -name "*.tex" | while read texfile; do rename 's/\.tex//' $texfile; done
Si tienes algo que deseas invocar solo una vez:
find . [-maxdepth 2] -name "*.tex" | xargs rename 's/\.tex//'
El último deja claro cuán útil es el cambio de nombre: si todo está ya en el mismo lugar, tienes un renombrador rápido de expresiones regulares.