Bash: alterando extensões de arquivos de todos os arquivos em um diretório e copiando linhas ímpares

1

Como é possível obter todos os arquivos *.txt em uma determinada pasta (entrada de usuários) e copiar linhas ímpares para arquivos com nomes idênticos, mas extensões diferentes (bat / html ou qualquer outra coisa)

Suponho que cp ou mv não funcionará, algo como sed deve fazer o truque para as linhas, mas estou tendo dificuldade em incorporar tudo junto.

Se alguém pudesse me ajudar a juntar isso eu ficaria muito grato

#!/bin/bash
clear

#seems like a good idea to get a full path to the directory im gonna be working in, not #sure how to go about it though. 

path=pwd

#getting users input

read Directory

#check if said directory exists
if[ -d $Directory]; then
#if it does
#all files with .txt extention are to be copied 
for *.txt in $(ls)
do
mv *.txt *.bat

#aaand now im lost, didnt have a chance to even test this, since i have linux only in #my studying enviroment (uni), will get on my personal PC later on
#something like sed could/should work in there, but i have no idea how to go about it

#if doesnt
else
echo "Directory does not exist or you do not have a permission to alter its contents"
    
por user225827 16.12.2013 / 00:15

3 respostas

3
#!/bin/sh 
cd "$1" || { echo "Couldn't cd to directory $1.  Quitting." ; exit 1 ; } 
for fname in *.txt
do
    awk 'NR % 2 == 1 { print; }' "$fname" >"${fname%.txt}.bat"
done

Coloque o acima em um arquivo e torne o arquivo executável ( chmod +x yourfilename ). Agora, execute este comando com o diretório no qual você deseja operar como o primeiro argumento.

O script é alterado para o diretório solicitado ( cd "$1" ). Se isso falhar (o diretório não existe), o script sairá com uma mensagem de erro. Se cd "$1" for bem-sucedido, o script passará por cada arquivo .txt no diretório, selecionará as linhas ímpares ( NR % 2 == 1 ) e as gravará em um arquivo com o mesmo nome, exceto na extensão ".bat".

    
por John1024 16.12.2013 / 00:24
0

Não tenho certeza do que você quer dizer com "linhas estranhas" [1], mas essa afirmação atinge exatamente o que seu código tenta fazer atualmente:

cd "$1" && rename 's/\.txt$/.bat/' *.txt

Não é necessário fazer suas próprias mensagens de erro, o shell fará isso muito bem.

[1] Isso faz com que pareça muito com um trabalho de casa da Uni.

    
por zwets 16.12.2013 / 08:41
-1

Obrigado a todos que responderam, você me ajudou muito a entender o bash scripting, agora que essa questão está resolvida, como alguém poderia fazer uma pergunta?

Eu usei script fornecido por John1024, trabalhei sem falhas. Muito obrigado por isso. Felicidades

! / bin / sh

cd "$ 1" || {echo "Não foi possível fazer o cd para o diretório $ 1. Quitting." ; saída 1; } para fname em * .txt Faz     awk 'NR% 2 == 1 {impressão; } '"$ fname" > "$ {fname% .txt} .bat" feito

    
por user225827 19.12.2013 / 23:14