Eu acho que teria feito isso usando find
, mas apenas para ajudar a responder suas perguntas sobre scripts, eu modifiquei ligeiramente o seu exemplo.
#!/bin/bash
for d in *; do # First level i.e. 2014, 2013 folders.
regx='^[0-9]+$' # Regular Expression to check for numerics.
echo "dir: $d"
if [[ $d =~ $regx ]]; then # Check if folder name is numeric.
echo "found num: $d"
pushd $d >& /dev/null
for z in *; do # Second level i.e. the months folders 01, 02 etc.
pushd $z >& /dev/null
for x in *; do # Third level the actual file.
echo "Compressing Image: $x"
done
popd >& /dev/null
done
popd >& /dev/null
fi
done
Sua abordagem parecia bem. Acho que parte do seu problema foi o uso de cd
. Você precisa voltar aos níveis de diretório quando estiver "andando" na árvore de diretórios. Normalmente, usarei pushd
e popd
, como adicionei ao seu exemplo.
Exemplo
Agora, quando eu executo isso no meu diretório de uploads do Wordpress:
$ pwd
/var/www/html/apps/wordpress/wp-content/uploads
Uma amostra de corrida:
$ ./asc.bash | head -15
dir: 2009
found num: 2009
Compressing Image: GURULABS-RPM-GUIDE-v1.0.pdf
Compressing Image: How_to_create_an_RPM_package.mht
Compressing Image: ss_mtr_1-150x150.png
Compressing Image: ss_mtr_1-300x146.png
Compressing Image: ss_mtr_1.png
Compressing Image: ss_mtr_2-150x150.png
Compressing Image: ss_mtr_2-300x115.png
Compressing Image: ss_mtr_2.png
Compressing Image: ss_mtr_3-150x150.png
Compressing Image: ss_mtr_3-300x117.png
Compressing Image: ss_mtr_3.png
Compressing Image: ss1_trac_gitplugin-1024x262.png
Compressing Image: ss1_trac_gitplugin-150x150.png
Melhorias
Eu adicionaria alguns testes antes de examinar um determinado mês nos casos em que o diretório desse mês estivesse vazio. Caso contrário, você terá isso:
Compressing Image: *
Compressing Image: *
Compressing Image: *
Andar por uma árvore de diretórios como essa pode ser complicado. Como a estrutura de diretórios é bastante estruturada, por que não andar assim:
for dir in 20*/*; do
echo "$dir"
for files in $dir/*; do
if [ -e $dir/$files ]; then
echo "$dir/$files: ..compress.."
fi
done
done
Ou assim:
for year in $(printf '%4d\n' {2000..2014}); do
echo "$year"
for mnth in $(printf '%02d\n' {00..12}); do
if [ -e $year/$mnth ]; then
echo "$mnth"
fi
done
done