Uau. Parece que você está fazendo isso mais difícil do que tem que ser:
find . -size -100c -exec stat -c "%s : %n" {} \;
Feito.
Esse script deve imprimir o tamanho do arquivo e o nome de todos os arquivos em um diretório com menos de 100 bytes. Esse script que escrevi funciona perfeitamente no meu Ubuntu, mas não funciona no meu Mac OS Lion. Alguém pode me dizer por quê?
#!/bin/bash
for i in $(ls)
do
if [[ $(wc -c $i | cut -d" " -f1) -le 100 ]]; then
echo $(wc -c $i)
fi
done
Veja esta postagem: Nested bash if / and / or statement não funciona do OS X para o Ubuntu
O Ubuntu usa dash
, não tenho certeza se você está usando bash
ou o que está no OSX. Coloque isso no topo para garantir que você está usando o mesmo shell nos dois sistemas:
#! /usr/bin/env bash
-ou -
#!/bin/bash
Você também pode echo $SHELL
ver qual shell está usando na linha de comando. Com os scripts bash
, você pode ativar a depuração adicionando esta linha na parte superior:
set -x
% ls -l
total 4
-rw-rw-r-- 1 saml saml 0 Jan 30 20:30 a1
-rw-rw-r-- 1 saml saml 0 Jan 30 20:30 a2
-rwxrwxr-x 1 saml saml 151 Jan 30 20:45 a.bash
% ./a.bash
0 a1
0 a2
% ./a.bash
++ ls
+ for i in '$(ls)'
++ wc -c a1
++ cut '-d ' -f1
+ [[ 0 -le 100 ]]
++ wc -c a1
+ echo 0 a1
0 a1
+ for i in '$(ls)'
++ wc -c a2
++ cut '-d ' -f1
+ [[ 0 -le 100 ]]
++ wc -c a2
+ echo 0 a2
0 a2
+ for i in '$(ls)'
++ wc -c a.bash
++ cut '-d ' -f1
+ [[ 123 -le 100 ]]
Refatorou o uso de um único processo externo:
for i in *; do
wc=$(wc -c <"$i")
case $wc in 100 ) ;; ???* ) continue ;; esac
echo "$wc $i"
done
Observe a citação, o uso do redirecionamento para evitar a necessidade de cut
e o uso de um padrão curinga para explorar o fato feliz de que qualquer número com três ou mais dígitos seja maior ou igual a 100.
(Seu código diz menos que ou igual a 100, enquanto a descrição do problema diz genuinamente menos que 100; você pode tirar o caso 100) ;;
se o seu código estiver errado e sua pergunta estiver correta.)
Observe que wc -c
conta caracteres, não bytes; para texto em uma codificação de comprimento variável ou multibyte, como Unicode, eles não são os mesmos.