
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'