【问题标题】:Find duplicated nested directories查找重复的嵌套目录
【发布时间】:2016-10-24 09:42:33
【问题描述】:

我有一个大型目录树,其中嵌套目录重复(但不是全部):

  • data/home/home/
  • 数据/横幅/横幅/
  • 资源/用户/文档/文档/

如何使用此操作仅合并重复的目录:

  • 复制(不替换)data/home/home/ 内容到 data/home/
  • 删除数据/主页/主页

我当前的代码:

#/bin/bash

for folder in $(find httpdocs -type d); do
    n=$(echo $folder | tr "/" "\n" | wc -l)
    nuniq=$(echo $folder | tr "/" "\n" | sort | uniq | wc -l)

    [ $n -eq $nuniq ] || echo "Duplicated folder $folder"
done

但是有一个问题,因为 data/home/es/home 是一个有效的文件夹,但被检测为重复。

谢谢。

【问题讨论】:

  • 您可能需要展示您的尝试才能获得其他用户的回复。
  • @Fazlin,我不知道该怎么做。我知道主要的 linux 命令,并且我知道如何在 bash 中使用 double for 和 counters 来做到这一点,但我需要更多优化。我将尽快发布一个示例。感谢您的提示。

标签: bash duplicates subdirectory


【解决方案1】:

你可以使用下面的 uniq 命令;

#/bin/bash

for folder in $(find httpdocs -type d); do
    nuniq=$(echo $folder | tr "/" "\n"  | uniq -d | wc -l)
     if [ "$nuniq" -gt "0" ]
      then
        echo "Duplicated folder $folder"
      fi
done

man uniq;

  -d, --repeated
          only print duplicate lines

您可以尝试以下脚本来复制和删除文件夹。我无法对此进行测试,因此请在运行此之前备份您的 httpdocs 文件夹。

#/bin/bash

for folder in $(find httpdocs -type d); do
    nuniq=$(echo $folder | tr "/" "\n"  | uniq -d | wc -l)
     if [ "$nuniq" -gt "0" ]
      then
        dest=$(echo $folder | tr '/' '\n' | awk '!a[$0]++' | tr '\n' '/')
        mv -i $folder/*  $dest
        rmdir $folder 
      fi
done

例如;

user@host $ echo "data/home/es/home" | tr "/" "\n"  
data
home
es
home

user@host $ echo "data/home/es/home" | tr "/" "\n"  | uniq -d | wc -l 
0

user@host $ echo "data/home/home" | tr "/" "\n"  
data
home
home

user@host $ echo "data/home/home" | tr "/" "\n" | uniq -d 
home

user@host $ echo "data/home/home" | tr "/" "\n" | uniq -d | wc -l
1

【讨论】:

    猜你喜欢
    • 2012-11-17
    • 2017-09-19
    • 2012-01-26
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多