retirar as extensões em subdirectórios
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:
-
Sed e encontrar
-
Rubi
-
Python
My Poor Tente:
$find . -maxdepth 2 -name "*.tex" -ok mv `sed 's@.tex@@g' {}` {} +
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