#!/bin/sh
mkdir -p ARCHIVE || exit 1
newest=
for file in ContractAdjustments.*.txt; do
if [ -f "$file" ]; then
if [ -z "$newest" ]; then
# this is the first file, initialize "newest"
newest=$file
elif [ "$file" -nt "$newest" ]; then
# file is newer than "newest",
# archive "newest" and set new newest file
mv -i "$newest" ARCHIVE
newest="$file"
else
# file is older, archive it
mv -i "$file" ARCHIVE
fi
fi
done
if [ -n "$newest" ]; then
printf 'Done. Newest file = %s\n' "$newest"
else
echo 'No files found'
fi
Esse script, desde que /bin/sh
implemente o -nt
teste em seu comando interno [
, mova todos os arquivos mais antigos para uma pasta ARCHIVE
, mantendo o arquivo mais recente intocado.
Ele faz isso iterando os nomes dos arquivos que correspondem ao padrão fornecido e, para cada arquivo, testando seu timestamp com o arquivo mais recente encontrado até o momento, movendo os arquivos dependendo se eles são novos ou antigos.
O script cuida corretamente de preservar quaisquer caracteres de espaço, etc. em nomes de arquivos. Isso pode não ser um problema neste caso em particular, mas, em geral, um nome de arquivo Unix pode conter tanto espaços quanto novas linhas incorporadas, bem como caracteres globbing de nomes de arquivo.
Se você quiser seguir o caminho do nome do arquivo , e não pelos carimbos de data e hora dos arquivos:
#!/bin/sh
mkdir -p ARCHIVE || exit 1
set -- ContractAdjustments.*.txt
while [ "$#" -gt 1 ]; do
mv -i "$1" ARCHIVE
shift
done
printf 'Done. Newest file = %s\n' "$1"
Isso definiria os parâmetros posicionais ( $1
, $2
, etc.) para a lista de arquivos correspondentes ao padrão fornecido. Então, enquanto ainda houver mais de um arquivo na lista, mova o primeiro arquivo da lista para o diretório ARCHIVE
e desloque-o da lista. O último arquivo na lista é o que classifica por último de acordo com seu nome de arquivo (este arquivo é deixado no lugar).