Zeilen ausschließen, die doppelte Wörter zwischen Trennzeichen enthalten

Zeilen ausschließen, die doppelte Wörter zwischen Trennzeichen enthalten

Ich habe eine Ordnerstruktur, die durch eine Reihe automatisierter Jobs (schlecht) gepflegt wurde. Eine der Nebenwirkungen dieser Jobs scheint zu sein, dass sie doppelte Ordnernamen (und in der Folge doppelte Bilder) erstellen.

Auf diesem Server sind Bilder im Umfang von etwa 50 GB gehostet, und vorsichtige Schätzungen gehen davon aus, dass mindestens 10 % davon dupliziert sind. Ich bin gerade dabei, auf eine neue Infrastruktur umzusteigen, und möchte die Dateien und Ordner deduplizieren.

Bei einer Verzeichnisstruktur wie folgt

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

Ich möchte ein Skript generieren, das nur die folgenden Ordner kopiert (keine Rekursion)

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

Die aktuelle duplizierte Struktur enthält über 2.200 Ordner, daher ist die manuelle Bereinigung kein effizienter, wiederholbarer Prozess.

Um die Sache noch komplizierter zu machen, muss ich die deduplizierten Elemente von einer AIX- in eine Windows 2012 R2-Umgebung migrieren. Ich kann Putty SCP verwenden, um Dateien zwischen Servern zu kopieren, oder ich kann ein ZIP-Archiv erstellen (bei 50 GB bin ich mir allerdings nicht sicher, ob das Archiv eine gute Idee ist).

Mein Ansatz wäre, alle Ordner zu finden und alle Ordner zu entfernen, die einen doppelten Namen unmittelbar nach dem vorherigen Namen haben, wobei ich '/' als Trennzeichen verwende. Logisch kann ich es also herausfinden, aber ich kann es nicht in einen Grep-Befehl irgendeiner Art übersetzen. Für jede Hilfe bin ich sehr dankbar.

Antwort1

Es ist nicht grep, aber hier ist ein Bash-Skript, das Ihnen das gewünschte Ergebnis liefern sollte:

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

Wenn Sie es benennen snowflake.sh, können Sie es folgendermaßen aufrufen:

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

Ersetzen Sie <source_dir>und <dest_dir>durch die tatsächlichen Pfade, die Sie haben.

Antwort2

Wie wäre es, dies zu verwenden:

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

Oder passend zu Ihrem geänderten Testfall

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

verwandte Informationen