
我有一個由許多自動化作業維護(糟糕)的資料夾結構。這些作業的副作用之一似乎是它會創建重複的資料夾名稱(以及隨後的重複圖像)。
我在此伺服器上託管了大約 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'