Pergunta

Eu preciso remover a extensão ".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, fazê-lo com algumas ferramentas abaixo:

  1. Sed e encontrar

  2. Rubi

  3. Python

My Poor Tente:

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

Solução

A Python script para fazer o mesmo:

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

Outras dicas

Uma maneira, não necessariamente o mais rápido (mas pelo menos o mais rápido desenvolvido):

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

É equivalente desde o seu maxdepth é 2. O script é apenas ecoando o comando mv no momento (para fins de teste) e trabalhar em arquivos C (desde que eu não tinha arquivos tex para teste com).

Ou, você pode usar achado com todo o seu poder assim:

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

Usando o "for i in" pode causar "muitos parâmetros" errrors

Uma abordagem melhor é encontrar tubulação para o próximo processo.

Exemplo:

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

(Nota: os arquivos do punho não vai com espaços)

Usando bash, find e mv do seu diretório base.

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

Variação 2 com base em outras respostas aqui.

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

PS: eu não conseguir o papel em escapar '.' por pax ...

Há um excelente roteiro renomeação Perl que vem com algumas distribuições, e caso contrário, você pode encontrá-lo na web. (Não tenho certeza onde ele reside oficialmente, mas é isso ) . Verifique se a sua mudança de nome foi escrito por Larry Wall (seção do autor de man rename). Ele permitirá que você fazer algo como:

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

Usando -exec é mais simples aqui, porque há apenas uma ação a ser executada, e não é muito caro para invocar renomear várias vezes. Se você precisar fazer várias coisas, use o formulário "enquanto leitura":

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

Se você tem algo que você quer invocar apenas uma vez:

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

Essa última deixa claro o quão útil renomeação é -. Se tudo já está no mesmo lugar, você tem um renamer regexp rápida

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top