
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'