Exclui linhas que possuem palavras duplicadas entre delimitadores

1

Eu tenho uma estrutura de pastas que foi (mal) mantida por um número de trabalhos automatizados. Um dos efeitos colaterais desses trabalhos parece ser o de criar nomes de pastas duplicados (e, posteriormente, duplicar imagens).

Eu tenho cerca de 50 GB de imagens hospedadas neste servidor e uma estimativa conservadora sugere que pelo menos 10% disso seja duplicado. Estou no processo de migração para alguma nova infraestrutura e gostaria de desduplicar os arquivos e pastas.

Dada uma estrutura de diretórios como segue

images/New_Site/Food
images/New_Site/Food/Content
images/New_Site/Food/Content/Content
images/New_Site/Food/Content/Waterfall
images/New_Site/Food/Food
images/New_Site/Food/Food/Content
images/New_Site/Food/Food/Recipes
images/New_Site/Food/Recipes
images/New_Site/Food/Recipes/Recipes
images/New_Site/Home
images/New_Site/Home/Home
images/New_Site/Kids
images/New_Site/Kids/Kids
images/New_Site/Men
images/New_Site/Men/Men
images/New_Site/New_Site
images/New_Site/New_Site/Baby
images/New_Site/New_Site/Beauty
images/New_Site/New_Site/Corporate
images/New_Site/New_Site/Corporate/About
images/New_Site/New_Site/Corporate/Careers
images/New_Site/New_Site/Corporate/Education
images/New_Site/New_Site/Corporate/Legal
images/New_Site/New_Site/Food

Eu quero gerar um script que copie apenas as seguintes pastas (sem recursão)

images/New_Site/Food
images/New_Site/Food/Content
images/New_Site/Food/Content/Waterfall
images/New_Site/Food/Recipes
images/New_Site/Home
images/New_Site/Kids
images/New_Site/Men

Existem mais de 2200 pastas na atual estrutura duplicada, portanto, limpá-las manualmente não é um processo repetível eficiente.

Para complicar, preciso migrar os itens desduplicados de um AIX para um ambiente Windows 2012 R2. Eu posso usar o Putty SCP para copiar arquivos entre servidores ou posso criar um arquivo zip (embora em 50Gb, não tenho certeza se o Archive é uma boa idéia).

Minha abordagem seria encontrar todas as pastas, remover qualquer pasta que tenha um nome duplicado imediatamente após o nome anterior usando o '/' como um delimitador. Então, logicamente, posso resolver isso, mas não consigo traduzi-lo para um comando do tipo grep. Qualquer ajuda muito apreciada.

    
por radimpe 10.03.2015 / 16:55

2 respostas

1

Não é grep, mas aqui está um script que deve dar o que você quer:

#!/bin/bash

srcdir=$1
destdir=$2
subdir=${3:-$destdir}
depth=$((${4:-0} + 1))
srcdirbase=${srcdir##*/}

for subdirdir in $srcdir/*/
do
   fixdir=${subdirdir%*/}
    fixbase=${fixdir##*/}
    if [ "$fixbase" != "*" -a "$fixbase" != "$srcdirbase" ]; then
        newsubdir=$subdir/$fixbase
        echo -e "mkdir \"$newsubdir\" && cp \"$fixdir/*\" \"$newsubdir\""
        if [ $depth -lt 20 ]; then
            ./$0 "$fixdir" "$destdir" "$newsubdir" $depth
        fi
    fi
done

Se você nomear snowflake.sh , poderá chamá-lo assim:

 (echo "#\!$SHELL"; ./snowflake.sh <source_dir> <dest_dir>) > bugfix.sh

Substituindo <source_dir> e <dest_dir> pelos caminhos reais que você tem.

    
por 10.03.2015 / 19:13
1

Que tal usar isso:

grep --invert-match '/(.+)/'

Ou para corresponder ao seu caso de teste modificado

grep --invert-match '(.+)/'
    
por 10.03.2015 / 19:31

Tags