排除分隔符號之間具有重複單字的行

排除分隔符號之間具有重複單字的行

我有一個由許多自動化作業維護(糟糕)的資料夾結構。這些作業的副作用之一似乎是它會創建重複的資料夾名稱(以及隨後的重複圖像)。

我在此伺服器上託管了大約 50GB 的圖像,保守估計表明其中至少有 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 命令。非常感謝任何幫助。

答案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>為您擁有的實際路徑。

答案2

怎麼樣使用這個:

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

或符合您修改後的測試案例

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

相關內容