我有一个文件夹结构,它由许多自动化作业(糟糕地)维护。这些作业的副作用之一似乎是它会创建重复的文件夹名称(以及随后的重复图像)。
我在这个服务器上托管了大约 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'