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=IFSprovavelmente 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
forletetc. Evite também muitos nomes de variáveis "comuns", por exemplo,LINES,COLUMNS, etc.-
por que o aliasing
exporttoexport? 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 umshsubshell: 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 .