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


Como alguém iria tomar todas as *.txt arquivos em uma determinada pasta (entrada de usuários) e copiando linhas ímpares para arquivos com nomes idênticos, mas extensão diferente (bat / html ou qualquer outra coisa)

eu assumo cp ou mv não vai 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"

1
2017-12-15 23:15


origem


Você quer mover as linhas ímpares em um arquivo ou em arquivos diferentes? - kiri
Eu quero copiar linhas estranhas em arquivos diferentes. Por exemplo, 1.txt -copy linhas ímpares para-> 1.bat - user225827


Respostas:


#!/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 muda para o diretório que você solicitou (cd "$1"). Se isso falhar (o diretório não existe), o script sairá com uma mensagem de erro. E se cd "$1" tiver sucesso, então o script passa por cada .txt arquivo no diretório, seleciona as linhas ímpares (NR % 2 == 1) e os grava em um arquivo com o mesmo nome, exceto com a extensão ".bat".


3
2017-12-15 23:24



Obrigado! Parece tão simplista agora que eu olho para isso Tenho que procurar o awk, já que eu não estou familiarizado com este comando - user225827


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 há necessidade de fazer suas próprias mensagens de erro, o shell vai fazê-las bem.

[1] Isso faz parecer muito com um trabalho de casa da Uni.


0
2017-12-16 07:41



linhas ímpares dos arquivos .txt im renomeando. A maioria é, tinha C durante todo o semestre que eu estava familiarizado antes da uni, então completei todas as tarefas em C, peguei um script para me familiarizar com o Unix. Muitas coisas para aprender, e depois de C / C ++ e alguns Assembly, fazendo coisas globalmente por tipo, em vez de percorrer todos os elementos um por um é um novo conceito que eu preciso me acostumar. Felicidades! - user225827


Obrigado a todos que responderam, você me ajudou muito a entender melhor o script do bash, agora que essa questão está resolvida, como alguém faria para fechar uma pergunta?

Eu usei script fornecido por John1024, funcionou perfeitamente. 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


-1
2017-12-19 22:14



Se a resposta dada por @ John1024 funcionou para você, aceite-a em vez de adicionar seus agradecimentos como uma "resposta" - consulte askubuntu.com/help/accepted-answer - steeldriver