Você precisa cuidar de várias coisas
-
aspas duplas para proteger o conteúdo de uma variável da interpretação de shell. O IFS contém provavelmente por padrão "espaço + tab + nova linha", portanto:
NEWIFS=IFS
provavelmente acabará colocando nada em NEWIFS.SAVEIFS="$IFS" ... IFS="$(echo -en "\n\b")" #yes, you can have " inside $( ... ) : the shell will gladly interpret them by # order of depth inside the $() construct. # A big advantage over using backquotes where it would get mixed up and almost unreadable ... IFS="$SAVEIFS"
-
Não use palavras reservadas como nomes de variáveis (evite
for
let
etc. Evite também muitos nomes de variáveis "comuns", por exemplo,LINES
,COLUMNS
, etc.-
por que o aliasing
export
toexport
? parece uma boa maneira de criar um loop se o shell for antigo ou, na melhor das hipóteses, inútil. -
precising
-name *
significa que você evita qualquer nome de arquivo ou nome de diretório começando com.
. -
-exec sh ....
irá lançá-lo em umsh
subshell: qualquer variável que você declarar lá será perdida assim que sh sair para o shell de chamada.
-
Você precisa de algo como:
#!/bin/bash
for adirectory in "$@" ; do
find "$adirectory" -type f -name '*.3gp' -print | while IFS= read -r wholeline ; do
mylength=$(echo "$wholeline" | wc -c) #Not needed, just kept as exemple of a way to achieve it
myfilewithoutext="$(echo "$wholeline" | sed -e 's/.3gp$//' )"
#keeps only the filename without its ".3gp" or ".3GP" extension.
ffmpeg -y -i "$wholeline" "${myfilewithoutext}.mp3" > /dev/null #? please check if it works
done #end of the find|while
done #end of the for looping on all the arguments passed to the script (dir names)
IFS
em que while IFS= read -r wholeline ; do
será definido como a string vazia APENAS durante a invocação do read -r wholeline
. Intocado fora dela. VAR="something" command parameters
invocará parâmetros de comando, com o valor de VAR
temporariamente definido como something
. Aqui, definimos o IFS como ''
, ou seja, nada. Ele ainda será transmitido linha por linha e, como IFS
está vazio, toda a linha acaba sendo lida por read wholeline
.