Exclua linhas que possuem palavras duplicadas entre delimitadores

Exclua linhas que possuem palavras duplicadas entre delimitadores

Eu tenho uma estrutura de pastas que foi (mal) mantida por vários trabalhos automatizados. Um dos efeitos colaterais desses trabalhos parece ser a criação de nomes de pastas duplicados (e subsequentemente imagens duplicadas).

Tenho cerca de 50 GB de imagens hospedadas neste servidor e uma estimativa conservadora sugere que pelo menos 10% disso está duplicado. Estou migrando 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

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 2.200 pastas na estrutura duplicada atual, portanto, limpá-las manualmente não é um processo repetível e eficiente.

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

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

Responder1

Não é grep, mas aqui está um script bash que deve fornecer o que você deseja:

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

Responder2

Que tal usar isso:

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

Ou para corresponder ao seu caso de teste modificado

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

informação relacionada