Não é possível stat sobre um nome de arquivo com espaço nele

2

Sou muito novo no shell de scripts e na criação de um script para um projeto. Eu estou tendo um problema ao fazer "stat" em um nome de arquivo, para verificar o tamanho, que tem espaços nele. O problema é que não consigo escrever o comando diretamente, e primeiro tenho que armazenar em uma variável então tenho que executá-lo via aquela variável. Por exemplo, meu script é:

##test.sh
###Start
OIFS=$IFS

IFS=$'\n'

filename=$1

a=stat
b=-c  
c=%s
d=${filename}

CMD="$a $b $c $d"

result='$CMD'

echo "Size is:"$result

IFS=$OIFS
###END

Configurei o IFS = $ '\ n' para passar o nome do arquivo com espaço como parâmetro. quando eu executo, então eu recebo:

[root@abhargava ~]# ./test.sh dirLevel1/file\ Level1.txt
./test.sh: line 9: stat -c %s dirLevel1/file Level1.txt: No such file or directory
Size is:

Por causa do IFS, acho que o shell está tratando o comando como uma única unidade sem dividi-lo em partes e, se eu remover essa configuração do IFS, ele diz:

[root@abhargava ~]# ./test.sh dirLevel1/file\ Level1.txt
stat: cannot stat 'dirLevel1/file': No such file or directory
stat: cannot stat 'Level1.txt': No such file or directory
Size is:

Portanto, trata-se o parâmetro como dois arquivos diferentes. Eu não posso usar "$ @" também porque eu estou recebendo o nome do arquivo de alguma outra lógica de listagem de arquivos em um diretório como

for i in 'find ${arg} -type f'
do
calling the test.sh
done

Por favor me ajude o mais rápido possível .. !! Agradecemos antecipadamente .... !!

    
por Anil Bhargava 04.02.2013 / 06:18

2 respostas

1

BASH FAQ # 50: "Estou tentando colocar um comando em uma variável, mas os casos complexos sempre falham!"

    
por 04.02.2013 / 06:56
0

Concordo com Ignacio, manter os scripts Bash simples é a melhor abordagem a ser adotada. A partir disso, simplifiquei o script para permitir que ele trabalhasse com espaços. Para permitir que ele manipule espaços, colocar o nome do arquivo entre aspas permitiu que o script lidasse com espaços no nome do arquivo.

##test.sh
###Start

result='stat -c %s "$1"'

echo "Size is:"$result

###END
    
por 04.02.2013 / 11:55