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
.