remove o shell script de arquivos “duplicados”

0

Eu tenho uma lista de arquivos nomeados:

file.txt
file (1).txt
file (2).txt
file (7).txt

etc.

Onde o maior (número) é o último arquivo atualizado, mas alguns números intermediários podem estar faltando e há outros arquivos no diretório também.

Como verificar se há um arquivo "duplicado" e, se houver, como copiar o conteúdo de file (maxnumer).txt para file.txt e remover todos os arquivos file (*).txt .

Eu tentei listá-los com ls -t file*(*)*.txt e, em seguida, fazer um loop for , mas isso me dá um erro ( ls ): bash:syntax error near unexpected token '('

    
por kurokirasama 29.06.2018 / 20:20

1 resposta

1

Supondo que os timestamps não são confiáveis, gostaríamos de encontrar o arquivo que possui o maior número entre parênteses no final do nome do arquivo.

Fazendo isso:

#!/bin/sh

prefix=$1

if [ -z "$prefix" ]; then
    printf 'Usage: %s prefix [ suffix ]\n' "$0" >&2
    exit 1
fi

suffix=$2

for filename in "$prefix ("*")$suffix"; do
    [ ! -f "$filename" ] && continue

    num=${filename##*\(}    # "file (xx).txt" --> "xx).txt"
    num=${num%\)*}          # "xx).txt" --> "xx"

    # if no max number yet, or if current number is higher, update max
    if [ -z "$max" ] || [ "$num" -gt "$max" ]; then
        max=$num
    fi
done

# if we have a max number, use it to rename the file and then remove the other files
if [ -n "$max" ]; then
    printf 'Would move %s to %s\n' "$prefix ($max)$suffix" "$prefix$suffix"
    # mv "$prefix ($max)$suffix" "$prefix$suffix"
    printf 'Would remove %s\n' "$prefix ("*")$suffix"
    # rm "$prefix ("*")$suffix"
else
    printf 'Found no files matching "%s (*)%s"\n' "$prefix" "$suffix"
fi

Executando:

$ tree
.
|-- file (1).txt
|-- file (2).txt
|-- file (7).txt
|-- file.list
|-- file.txt
'-- script.sh

0 directory, 6 files

$ sh script.sh file .txt
Would move file (7).txt to file.txt
Would remove file (1).txt
Would remove file (2).txt
Would remove file (7).txt

(remova o comentado mv e rm para modificar arquivos)

Isso falharia em nomes de arquivos como file (2) (30).txt (eles também seriam correspondidos), pois pressupõe que todos os nomes de arquivos sigam o padrão prefix (NN)suffix , em que NN é um número inteiro.

    
por 29.06.2018 / 20:39