排除分隔符之间有重复单词的行

排除分隔符之间有重复单词的行

我有一个文件夹结构,它由许多自动化作业(糟糕地)维护。这些作业的副作用之一似乎是它会创建重复的文件夹名称(以及随后的重复图像)。

我在这个服务器上托管了大约 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'

相关内容