Como manter apenas o arquivo mais recente na pasta e mover arquivos antigos para a localização do arquivo

1

Na minha pasta eu tenho vários arquivos semelhantes a estes:

ContractAdjustments.CHRS201804202144.txt
ContractAdjustments.CHRS201804212144.txt
ContractAdjustments.CHRS201804222144.txt
ContractAdjustments.CHRS201804232144.txt

Eu só quero manter o arquivo mais novo e mover o restante para um local de arquivo. Estou usando o seguinte script, o que me dá um erro:

$ find -maxdepth 1 -type f -iname 'ContractAdjustments.*.TXT' -printf '%T@|%p\n' | sort -r -n | tail -n +2 | cut -d'|' -f2 | xargs -i mv {} ARCHV
    
por madhukar korakandla 26.06.2018 / 22:55

4 respostas

1

#!/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).

    
por 27.06.2018 / 07:39
0

Uma maneira fácil de fazer isso seria:

mv 'ls -t ContractAdjustments.*.txt | awk '{ iteration+=1; if (iteration > 1) { print } } ' ' ARCHV

Naturalmente, isso produzirá erros nas condições de borda (por exemplo, se houver apenas um arquivo no diretório), mas sempre funcionará.

    
por 27.06.2018 / 01:41
0

Coloque uma lista de todos os arquivos, exceto o primeiro em uma variável e execute um loop for nele.

 listinmemory='ls -alht | tail -n +5 | awk '{print $9}''; for each in $listinmemory; do mv $each /path/to/directory; done

ls -alht listará 4 linhas nas quais você não deseja executar nada,

total 123K
drwxr-xr-x.  5 user user 1.0K Jun 27 09:20 .
drwx------. 13 user user 2.0K Jun 27 10:36 ..
-rw-rw-r--.  1 user user 3.0K Jun  6 18:29 file1 

o arquivo mais recente e 3 linhas - então todos os arquivos que você faz, então tail -n +5 pulará as 4 primeiras linhas e executará mv $each /path/to/directory em todos os arquivos que encontrar!

    
por 27.06.2018 / 04:10
0

Não é uma boa ideia analisar ls no seu caso, cd no diretório e seguir com isto:

 for CA in $(find . -maxdepth 1 -type f -name ContractAdjustments\*.txt | head --lines=-1); do mv $CA /path/to/archive/; done

Usando um loop for com substituição de comando, que localiza todos os arquivos no diretório começando com o formato ContractAdjustments*.txt especificado e os relaciona na ordem da mais antiga para a mais recente, de acordo com a data da segundo octeto. Em seguida, é canalizado para --head --lines=-1 , que imprime todos, exceto a última linha, que é o arquivo mais recente, e passa o valor para a variável CA (para ContractAdjustments). Finalmente, o do usa mv para mover todos, exceto o arquivo mais novo para o local do arquivo.

    
por 27.06.2018 / 07:04

Tags