Domanda

Devo rimuovere l'estensione " .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

Per favore, fallo con alcuni strumenti qui sotto:

  1. Sed e trova

  2. Ruby

  3. Python

My Poor Try:

$find . -maxdepth 2 -name "*.tex" -ok mv `sed 's@.tex@@g' {}` {} +
È stato utile?

Soluzione

Uno script Python per fare lo stesso:

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')

Altri suggerimenti

Un modo, non necessariamente il più veloce (ma almeno il più veloce sviluppato):

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

È equivalente poiché il tuo maxdepth è 2. Lo script sta solo facendo eco al comando mv al momento (a scopo di test) e sta lavorando su file C (poiché non avevo tex file con cui provare).

Oppure, puoi usare find con tutto il suo potere così:

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

Uso di " per i in " può causare "troppi parametri" errrors

Un approccio migliore è reindirizzare al processo successivo.

Esempio:

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

(Nota: non gestirai i file con spazi)

Utilizzando bash , find e mv dalla directory di base.

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

Variazione 2 in base alle altre risposte qui.

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

PS: non ho ricevuto la parte relativa all'evasione di '. ' da pax ...

Esiste un eccellente script per rinominare il Perl fornito con alcune distribuzioni, altrimenti puoi trovarlo sul web. (Non sono sicuro di dove risieda ufficialmente, ma questo è ) . Controlla se la tua ridenominazione è stata scritta da Larry Wall (sezione AUTORE di man rename ). Ti permetterà di fare qualcosa del tipo:

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

L'uso di -exec è più semplice qui perché c'è solo un'azione da eseguire e non è troppo costoso invocare la ridenominazione più volte. Se devi fare più cose, usa " mentre leggi " forma:

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

Se hai qualcosa che vuoi invocare una sola volta:

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

Quest'ultimo chiarisce quanto sia utile rinominare - se tutto è già nello stesso posto, hai un rinominatore regexp veloce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top