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:

  1. Sed y encuentra

  2. Ruby

  3. Python

Mi pobre intento:

$find . -maxdepth 2 -name "*.tex" -ok mv `sed 's@.tex@@g' {}` {} +
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top