rimozione delle estensioni nelle sottodirectory
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:
-
Sed e trova
-
Ruby
-
Python
My Poor Try:
$find . -maxdepth 2 -name "*.tex" -ok mv `sed 's@.tex@@g' {}` {} +
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.