POSIX define a opção -p
para o utilitário pathchk
, então ...
Se os nomes de arquivos que você está procurando devem corresponder apenas aos caracteres no conjunto de caracteres portátil do arquivo - que é composto de letras e dígitos ASCII e ._-/
- então o seguinte comando funcionará bem any sem ter que fazer mais stat()
chamadas do que a shell faz para glob:
if pathchk -p town-*.swf city-*.swf
then mkdir towns
fi
Outra maneira é globar o nome do caminho duas vezes - uma vez para um valor já conhecido e outra para o desconhecido. Se o valor conhecido glob não for retirado, é porque o valor desconhecido não foi resolvido.
Considere o seguinte:
mkdir test
touch test/testfile1
echo tes[t]/test*1 tes[t]/test*2
OUTPUT
test/testfile1 tes[t]/test*2
Aqui, sabemos que o caminho test
existe e, portanto, podemos testar sua resolução ao tentar corresponder à resolução do caminho desconhecido.
Por exemplo, suponhamos que seu diretório de trabalho atual seja composto inteiramente de nomes de caminho que não terminem com ?
e não haja caminhos únicos que façam isso. Esta não é uma suposição tão grande para fazer - pode até ser assegurada como:
cd /tmp/no_question_mark\? && {
$_handle_it || exit
}; ln -s "$PWD" /tmp/no_question_marks
cd /tmp/no_question_marks
Essa suposição feita, você pode fazer algo como:
set "${PWD%?}"?/town-*.swf "${PWD%?}"?/city-*.swf
case "$*" in (*\?/*) ! echo 'missed at least one...';;
(*) echo 'got em all!'; mkdir towns;;
esac