Sugestão usando o GNU date :
yesterday=$( date -d yesterday +%F )
drop_dir=/tmp/drop
archive_dir=/tmp/arch
mkdir -p "$archive_dir"
mv -f "$drop_dir"/*"$yesterday"*.gz "$archive_dir"
Aqui, "$drop_dir"/*"$yesterday"*.gz será expandido para todos os arquivos correspondentes ao padrão especificado. Isto irá funcionar enquanto o padrão se expandir para vários milhares de caracteres, caso em que o shell irá reclamar com "Argument list too long".
Ou, se você realmente quiser fazer o loop para produzir cada nome de arquivo à medida que eles são movidos (somente o comando mv acima é alterado para o seguinte):
for name in "$drop_dir"/*"$yesterday"*.gz; do
[ -f "$name" ] || continue
mv "$name" "$archive_dir"
printf 'Moved "%s"\n' "$name"
done
Aqui, o loop for iterará os mesmos nomes usados na variação anterior, mas um por um. Cada nome será mantido em $name (que inclui o nome do diretório). Se não houver arquivos correspondentes ao padrão, o padrão permanecerá não expandido. É por isso que fazemos um teste explícito para garantir que $name realmente corresponda a um arquivo existente antes de movê-lo.
Ou com find :
find "$drop_dir" -maxdepth 1 -type f -name "*$yesterday*.gz" \
-print -exec mv {} "$archive_dir" ';'
Aqui, find selecionará os nomes de $drop_dir que correspondem aos arquivos regulares ( -type f ) e que correspondem ao padrão dado a -name . Para cada um desses nomes, mv é chamado para mover o arquivo para a pasta de destino. Antes de chamar mv , -print listará o nome do arquivo (incluindo o caminho) no terminal.
A opção -maxdepth 1 impede que find recorra a subpastas de $drop_dir .