1

У меня есть структура папок, которая (плохо) поддерживается рядом автоматизированных заданий. Одним из побочных эффектов этих заданий является то, что они создают дублированные имена папок (и впоследствии дублирующие изображения).

У меня есть около 50 ГБ изображений, размещенных на этом сервере, и, по скромным подсчетам, по крайней мере 10% из них дублируется. Я нахожусь в процессе перехода на какую-то новую инфраструктуру и хотел бы дедуплицировать файлы и папки.

Учитывая структуру каталогов следующим образом

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

Я хочу создать сценарий, который будет копировать только следующие папки (без рекурсии)

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

В текущей дублированной структуре содержится более 2200 папок, поэтому очистка вручную не является эффективным повторяемым процессом.

Чтобы усложнить ситуацию, мне нужно перенести дедуплицированные элементы из AIX в среду Windows 2012 R2. Я могу использовать Putty SCP для копирования файлов между серверами или создать zip-архив (хотя на 50Gb, но не уверен, что архив является хорошей идеей).

Мой подход заключается в том, чтобы найти все папки, удалить любую папку, которая имеет повторяющееся имя, сразу после предыдущего, используя «/» в качестве разделителя. Логично, что я могу решить это, но не могу перевести это в какую-то команду grep. Любая помощь с благодарностью.

2 ответа2

1

Это не grep, но вот скрипт bash, который должен дать вам то, что вы хотите:

#!/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

Если вы называете это snowflake.sh то вы можете назвать это так:

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

<source_dir> и <dest_dir> фактическими путями, которые у вас есть.

1

Как насчет использования этого:

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

Или в соответствии с вашим измененным тестовым примером

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .