Mover arquivos com o mesmo nome de arquivo sem distinção entre maiúsculas e minúsculas

1

O proprietário dos dados me pediu para copiar uma pasta específica (e sua grande quantidade de subpastas e arquivos) via FTPS para o nosso provedor de armazenamento em nuvem. Eu estou usando o LFTP para isso, e o upload funcionou bem até eu atingir um obstáculo.

Existem várias pastas com vários arquivos que possuem o mesmo nome de arquivo, exceto maiúsculas e minúsculas. Por exemplo, a pasta data tem os seguintes arquivos: testfile1.txt , TestFile1.TXT

Quando tento fazer o upload desses através do LFTP, recebo um erro informando que o arquivo já existe. Portanto, para os meus objetivos, preciso que os arquivos não diferenciam maiúsculas de minúsculas antes de fazer o upload. Para resolver esse problema, gostaria de usar um script que pesquisa o diretório atual de forma recursiva e mova todas as duplicatas sem distinção entre maiúsculas e minúsculas para uma subpasta. No meu exemplo acima, eu gostaria que o script criasse uma subpasta chamada Duplicatas e movesse TestFile1.TXT para ela. Eu suponho que é possível que eu possa ter vários nomes de arquivos duplicados, então o script deve criar uma pasta Duplicates2 para o segundo nome de arquivo duplicado, e assim por diante.

Além disso, devo observar que, para os poucos arquivos "duplicados" que eu verifiquei, eles tinham diferentes tamanhos de arquivos. Não vou fazer nenhuma suposição sobre os arquivos serem duplicatas reais , e é por isso que quero movê-los em vez de excluí-los.

    
por Joe 09.04.2018 / 17:01

2 respostas

0

O script basico abaixo percorre os arquivos no diretório atual, procurando por nomes de arquivos duplicados insensivelmente. Se uma correspondência for encontrada, será criada uma pasta "Duplicatas" que ainda não existe e, em seguida, moverá o arquivo duplicado para esse diretório.

O loop externo está lá para recalcular o arquivo globs ( * ) para os loops, no caso de um arquivo ser movido. O loop externo é executado até que nenhum arquivo seja movido.

#!/bin/bash

changes=1
while [ $changes -gt 0 ]
do
  changes=0
  for one in *
  do
    for two in *
    do
      shopt -u nocasematch
      # if it's the exact same filename, skip
      [[ "$one" == "$two" ]] && continue
      shopt -s nocasematch
      # if the file name matches case-insensitively, then mv it
      if [[ "$one" == "$two" ]]
      then
        suffix=
        while [ -d Duplicates"${suffix}" ]
        do
          suffix=$((suffix + 1))
        done
        mkdir Duplicates"${suffix}"
        mv "$two" Duplicates"${suffix}"
        changes=1
        break
      fi
    done
  done
done

Com estes arquivos de amostra:

afile.txt
TestFile1.TXT
TESTfile1.txT
testfile1.txt

Uma amostra de execução do script cria:

$ tree .
.
├── afile.txt
├── Duplicates
│   └── TestFile1.TXT
├── Duplicates1
│   └── testfile1.txt
└── TESTfile1.txT
    
por 09.04.2018 / 17:43
0

Em vez de criar um script muito complexo para classificar maiúsculas e minúsculas, você pode tornar o caso de FTP sensível, de modo que não seja necessário fazer isso. Consulte a página man do LFTP para detalhes sobre as opções: Verifique se o seu comando LFTP realmente não tem sinalizador.

-i, --nocase case-insensitive pattern matching

Você pode transferir as pastas como os nomes de arquivos devem ser válidos no host. Adicionar mais detalhes sobre o host de destino ajudaria.

Além disso, eu recomendo verificar se você pode implementar esta solução com base na extensão do arquivo .

LFTP mget ignoring case

*.[cC][sS][vV]

Tenho certeza de que você não tem esse problema também.

Se ainda assim, o requisito real é ter um script. Você pode criar um script python usando o conjunto.

    
por 09.04.2018 / 17:38