Questão Remover arquivos com o mesmo nome da subpasta


Dado o layout a seguir, como posso excluir arquivos nas pastas Attic que têm um arquivo correspondente na pasta pai? (Os arquivos terão o mesmo nome, não necessariamente o mesmo conteúdo)

/folder1
    /Attic
        fileA.txt,v  (problem file)
    fileA.txt,v
    fileB.txt,v
    FileC.txt,v
/folder2
    /Attic
        fileD.txt,v  (another problem file)
        fileX.txt,v  (NOT a problem file)
    fileD.txt,v
    fileE.txt,v
    FileF.txt,v

Background: Estou tentando limpar um repositório CVS para migrar para o git. O CVS cria uma pasta 'Attic' para arquivos excluídos. Nos últimos 10 anos, algumas coisas ruins aconteceram, o que significa que alguns arquivos com o mesmo nome existem em pastas vivas e mortas. Eu estou totalmente ciente dos riscos e implicações. Eu fiz backup dos meus dados e estou trabalhando em uma cópia.


0


origem


Eu esperava que o cvs-fast-export lidasse com tais situações de forma adequada (afaik, elas não são raras) - você tem certeza de que ele não migrará o repositório corretamente? - grawity
Eu vou ter que investigar. Eu estou usando cvs2git, e não totalmente em casa em um terminal unix. Não parece haver uma opção para descartar os arquivos Attic conflitantes. - Denham Coote
Tente cvs-fast-export então. Vejo esr.ibiblio.org/?p=5190 e esr.ibiblio.org/?p=4745 também. - grawity
Não tive a chance de olhar para os dois links acima - As regras do Firewall no trabalho não gostam de certos tipos de quadros de mensagens / fóruns. Seu script fez o truque, e agora tenho uma referência para trabalhar a partir de um problema semelhante (gerenciamento de arquivos) no futuro. - Denham Coote


Respostas:


No bash:

shopt -s globstar;
for file in ./**/Attic/*; do
    if [[ -e ${file%/*/*}/${file##*/} ]]; then
        rm -vf "$file";
    fi;
done;

Com globstar ativado, ** combina arquivos recursivamente (independentemente da profundidade). ${var#text} e ${var%text} permitir a remoção do prefixo ou sufixo de uma variável, ${file%/*/*} resulta no nome do diretório (menos "/ Attic /…"), enquanto ${file##*/} é o nome do arquivo base.

Você também deve considerar ferramentas como cvs-fast-export e reposurgeon; Eu esperaria que eles lidassem corretamente com tais situações desde o começo. Se não, então, pelo menos, verifique se você tem a versão mais recente do cvs2git...


2



Isso funciona muito bem, obrigado! Como bônus, ele não é lançado por nomes de arquivos com espaços ou v. Muito apreciado! - Denham Coote