Separar argumento pela extensão com espaço no nome.. [RESOLVIDO]

1. Separar argumento pela extensão com espaço no nome.. [RESOLVIDO]

Thiago Condé de Oliveira
condtec

(usa Debian)

Enviado em 10/01/2021 - 14:46h

Tenho um script.sh que recebe o seguintes argumentos:

   ./script.sh /home/thiago/Documentos/scripts/2021-01-08 10-21-55_10.34.4.mp4 /home/thiago/Documentos/scripts/2021-01-08 12-46-17_12.58.52.mkv /home/thiago/Documentos/scripts/3.mp4 


Como é uma aplicação .desktop chamando o %F ele passa os arquivos dessa forma, não separando por "". Por conter espaço nos nome o BASH interpreta como sendo 5 parâmetros por conter espaço em branco nos nomes. Preciso que ele reconheça apenas 3 parâmetros. A quebra pode ser feita pela extensão .mp4 .mkv ou outra qualquer. Preciso que o resultado seja este:

1. /home/thiago/Documentos/scripts/2021-01-08 10-21-55_10.34.4.mp4
2. /home/thiago/Documentos/scripts/2021-01-08 12-46-17_12.58.52.mkv
3. /home/thiago/Documentos/scripts/3.mp4

tentei mas sem sucesso:
find "$@" -type f -name '*.mp4' -exec echo -e "{}/n" \;  



  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 10/01/2021 - 16:58h


condtec escreveu:

Realmente resolve o problema e cria outro! Se eu conseguisse renomear apenas estes, mas o maximo eu consigo obter é o argumento daquela forma. Eu nao posso renomear todos os arquivos da pastas.. Nem mesmo estes posso renomear..
a chamada do comando nao coloca aspas duplas, isso que esta atrasando a conclusão do script.. Mesmo assim valeu pela dica!!

-------------------------------------------------------------------------------------------------------------
Outra opção, no script coloque:
echo "$@"|sed -r 's|mkv \|mp4 |&\n|g'
E terá o resultado:
/home/thiago/Documentos/scripts/2021-01-08 10-21-55_10.34.4.mp4
/home/thiago/Documentos/scripts/2021-01-08 12-46-17_12.58.52.mkv
/home/thiago/Documentos/scripts/3.mp4



______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.


______________________________________________________________________


3. Re: Separar argumento pela extensão com espaço no nome.. [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 10/01/2021 - 15:51h


condtec escreveu:

Tenho um script.sh que recebe o seguintes argumentos:

   ./script.sh /home/thiago/Documentos/scripts/2021-01-08 10-21-55_10.34.4.mp4 /home/thiago/Documentos/scripts/2021-01-08 12-46-17_12.58.52.mkv /home/thiago/Documentos/scripts/3.mp4 


Como é uma aplicação .desktop chamando o %F ele passa os arquivos dessa forma, não separando por "". Por conter espaço nos nome o BASH interpreta como sendo 5 parâmetros por conter espaço em branco nos nomes. Preciso que ele reconheça apenas 3 parâmetros. A quebra pode ser feita pela extensão .mp4 .mkv ou outra qualquer. Preciso que o resultado seja este:

1. /home/thiago/Documentos/scripts/2021-01-08 10-21-55_10.34.4.mp4
2. /home/thiago/Documentos/scripts/2021-01-08 12-46-17_12.58.52.mkv
3. /home/thiago/Documentos/scripts/3.mp4

tentei mas sem sucesso:
find "$@" -type f -name '*.mp4' -exec echo -e "{}/n" \;  

Boa tarde condtec.
Sugestões:
1- Retire os espaços do nome dos arquivos, isso só causa problemas....
O comando rename torna isso muito simples,
Exemplo:
ls -l Público/Arquivo*
-rw-r--r-- 1 adminq adminq 0 jan 10 15:40 'Público/Arquivo teste 1.txt'
-rw-r--r-- 1 adminq adminq 0 jan 10 15:40 'Público/Arquivo teste 2.txt'
-rw-r--r-- 1 adminq adminq 0 jan 10 15:40 'Público/Arquivo teste 3.txt'
-rw-r--r-- 1 adminq adminq 0 jan 10 15:40 'Público/Arquivo teste 4.txt'
-rw-r--r-- 1 adminq adminq 0 jan 10 15:40 'Público/Arquivo teste 5.txt'
adminq@Q4OS:$ → rename -n 's/ /_/g' Público/*
rename(Público/Arquivo teste 1.txt, Público/Arquivo_teste_1.txt)
rename(Público/Arquivo teste 2.txt, Público/Arquivo_teste_2.txt)
rename(Público/Arquivo teste 3.txt, Público/Arquivo_teste_3.txt)
rename(Público/Arquivo teste 4.txt, Público/Arquivo_teste_4.txt)
rename(Público/Arquivo teste 5.txt, Público/Arquivo_teste_5.txt)
Para efetivar a alteração RETIRE o -n
Opção 2:
Passe cada parâmetro entre aspas duplas:
Exemplo:
./param.sh "Público/Arquivo teste 1.txt" "Público/Arquivo teste 2.txt" "Público/Arquivo teste 3.txt" "Público/Arquivo teste 4.txt" "Público/Arquivo teste 5.txt"
Nº parametros:5
Parametros:
P1:Público/Arquivo teste 1.txt
P2:Público/Arquivo teste 2.txt
P3:Público/Arquivo teste 3.txt
P4:Público/Arquivo teste 4.txt
P5:Público/Arquivo teste 5.txt
cat param.sh
#!/bin/bash
echo -e "Nº parâmetros:$#\nP1:$1\nP2:$2\nP3:$3\nP4:$4\nP5:$5"




______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.


______________________________________________________________________



4. Re: Separar argumento pela extensão com espaço no nome.. [RESOLVIDO]

Thiago Condé de Oliveira
condtec

(usa Debian)

Enviado em 10/01/2021 - 16:12h

Realmente resolve o problema e cria outro! Se eu conseguisse renomear apenas estes, mas o maximo eu consigo obter é o argumento daquela forma. Eu nao posso renomear todos os arquivos da pastas.. Nem mesmo estes posso renomear.. a chamada do comando nao coloca aspas duplas, isso que esta atrasando a conclusão do script.. Mesmo assim valeu pela dica!!


5. Re: Separar argumento pela extensão com espaço no nome.. [RESOLVIDO]

Thiago Condé de Oliveira
condtec

(usa Debian)

Enviado em 10/01/2021 - 17:16h

msoliver escreveu:


condtec escreveu:

Realmente resolve o problema e cria outro! Se eu conseguisse renomear apenas estes, mas o maximo eu consigo obter é o argumento daquela forma. Eu nao posso renomear todos os arquivos da pastas.. Nem mesmo estes posso renomear..
a chamada do comando nao coloca aspas duplas, isso que esta atrasando a conclusão do script.. Mesmo assim valeu pela dica!!

-------------------------------------------------------------------------------------------------------------
Outra opção, no script coloque:
echo "$@"|sed -r 's|mkv \|mp4 |&\n|g'
E terá o resultado:
/home/thiago/Documentos/scripts/2021-01-08 10-21-55_10.34.4.mp4
/home/thiago/Documentos/scripts/2021-01-08 12-46-17_12.58.52.mkv
/home/thiago/Documentos/scripts/3.mp4



______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.


______________________________________________________________________


Deu certinho aqui!! agora eu precisava colocar isso dentro de um for ou de um find, pois chamo um script passando esses parâmetros. Sou iniciante em bash... como seria essa expressao no find?

find "$@"|sed -r 's|mkv \|mp4 |&\n|g' -exec echo -e "{}/n" \;  


No caso depois do -exec irei colocar o mando!


6. Re: Separar argumento pela extensão com espaço no nome..

Thiago Condé de Oliveira
condtec

(usa Debian)

Enviado em 10/01/2021 - 18:36h

Eu até consegui graças a voce!! Porem esta na gambiarra pois nao sei como funciona essas expressões nao mesmo assim valeu!!!


output=$(echo "$*" | sed -r 's|mkv\|mp4|&,|g')
output=$(echo "$output" | sed -r 's|, |,|g')
output=$(echo "$output" | sed -r 's|, /|,/|g')
#echo $output


IFS=","
find $output -exec echo {} \;



Se puder me ajudar a simplificar!! assim deu certinho!!


7. Re: Separar argumento pela extensão com espaço no nome.. [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 10/01/2021 - 19:52h


condtec escreveu:

Eu até consegui graças a voce!! Porem esta na gambiarra pois nao sei como funciona essas expressões nao mesmo assim valeu!!!


output=$(echo "$*" | sed -r 's|mkv\|mp4|&,|g')
output=$(echo "$output" | sed -r 's|, |,|g')
output=$(echo "$output" | sed -r 's|, /|,/|g')
#echo $output


IFS=","
find $output -exec echo {} \;


Se puder me ajudar a simplificar!! assim deu certinho!!

Condtec, o que você precisa na saída?
Com o comando:
echo "$@"|sed -r 's|mkv \|mp4 |&\n|g'
Já tens um argumento por linha.
Se quer numerar, faça:
sed -r 's|mkv \|mp4 |&\n|g' <<< "$@"|nl -n rz -w2 -s '-'
----------------------------------------------------
01-/home/thiago/Documentos/scripts/2021-01-08 10-21-55_10.34.4.mp4
02-/home/thiago/Documentos/scripts/2021-01-08 12-46-17_12.58.52.mkv
03-/home/thiago/Documentos/scripts/3.mp4
-----------------------------------------------------
O que vc pretende com os comandos:
output=$(echo "$*" | sed -r 's|mkv\|mp4|&,|g') #Separa os argumentos com ''virgula''
output=$(echo "$output" | sed -r 's|, |,|g') #Troca ", " por ","
output=$(echo "$output" | sed -r 's|, /|,/|g') #Troca ", /" por ",/"

O comando Find é para procurar arquivos, já tem os arquivos!!!!
Os quais foram passados como argumentos.


______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________




8. Re: Separar argumento pela extensão com espaço no nome.. [RESOLVIDO]

Thiago Condé de Oliveira
condtec

(usa Debian)

Enviado em 10/01/2021 - 20:10h

msoliver escreveu:


condtec escreveu:

Eu até consegui graças a voce!! Porem esta na gambiarra pois nao sei como funciona essas expressões nao mesmo assim valeu!!!


output=$(echo "$*" | sed -r 's|mkv\|mp4|&,|g')
output=$(echo "$output" | sed -r 's|, |,|g')
output=$(echo "$output" | sed -r 's|, /|,/|g')
#echo $output


IFS=","
find $output -exec echo {} \;


Se puder me ajudar a simplificar!! assim deu certinho!!

Condtec, o que você precisa na saída?
Com o comando:
echo "$@"|sed -r 's|mkv \|mp4 |&\n|g'
Já tens um argumento por linha.
Se quer numerar, faça:
sed -r 's|mkv \|mp4 |&\n|g' <<< "$@"|nl -n rz -w2 -s '-'
----------------------------------------------------
01-/home/thiago/Documentos/scripts/2021-01-08 10-21-55_10.34.4.mp4
02-/home/thiago/Documentos/scripts/2021-01-08 12-46-17_12.58.52.mkv
03-/home/thiago/Documentos/scripts/3.mp4
-----------------------------------------------------
O que vc pretende com os comandos:
output=$(echo "$*" | sed -r 's|mkv\|mp4|&,|g') #Separa os argumentos com ''virgula''
output=$(echo "$output" | sed -r 's|, |,|g') #Troca ", " por ","
output=$(echo "$output" | sed -r 's|, /|,/|g') #Troca ", /" por ",/"

O comando Find é para procurar arquivos, já tem os arquivos!!!!
Os quais foram passados como argumentos.


______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________



Eu passo esses links para outro script, e dentro do laço find, ele executa um por um, com o find deu mais certo, pois demora horas a execução de cada instancia. O que eu preciso é dos caminhos, para enviar na execução de outro script. o que fiz ai foi aproveitar o resultado do echo e remover os espaços em branco e colocar a virgula.



9. Re: Separar argumento pela extensão com espaço no nome..

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 10/01/2021 - 20:45h

Veja se resolve, troquei os espaços por "\ ";
Sem laço:
sed -r 's|txt |&\n|g' <<< "$@"|sed 's| |\\\\ |'|xargs -n1 -iZ bash -c "echo Arquivo:Z ;ls -l Z;sleep 0.5;echo;"
[/code]
Coloque os comandos que deseja, após o bash -c, entre aspas duplas, conforme exemplo!!!
O Z, e cada argumento/arquivo.
______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________




10. Re: Separar argumento pela extensão com espaço no nome.. [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 11/01/2021 - 21:37h

Coloque os endereços de arquivos entre "aspas duplas" ou 'aspas simples'.


11. Re: Separar argumento pela extensão com espaço no nome.. [RESOLVIDO]

Thiago Condé de Oliveira
condtec

(usa Debian)

Enviado em 11/01/2021 - 22:30h

bilufe escreveu:

Coloque os endereços de arquivos entre "aspas duplas" ou 'aspas simples'.


Infelismente não da pra colocar aspas duplas, mas resolvi aqui com :

output=$(echo "$*" | sed -r 's|mkv\|mp4|&,|g')
output=$(echo "$output" | sed -r 's|, |,|g')
output=$(echo "$output" | sed -r 's|, /|,/|g')


valeu!!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts