Поиск дублированных вложенных каталогов

#bash #duplicates #subdirectory

#bash #дубликаты #подкаталог

Вопрос:

У меня есть большое дерево каталогов с дубликатами этих вложенных каталогов (но не всех):

  • данные/главная/home/
  • данные/баннеры/banners/
  • ресурсы / пользователи /документы/documents/

Как я могу объединить только дублированные каталоги с помощью этих действий:

  • скопируйте (без замены) data/home/home/ содержимое в data/home/
  • удалить данные/главная/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 является допустимой папкой, но обнаружена как дублированная.

Спасибо.

Комментарии:

1. Возможно, вам потребуется показать свои попытки, чтобы получить ответы от других пользователей.

2. @Fazlin, я не знаю, как я могу попытаться это сделать. Я знаю основные команды Linux и я знаю, как я могу это сделать с помощью двойного for и счетчиков в bash, но мне нужно еще немного оптимизировать. Я опубликую пример как можно скорее. Спасибо за совет.

Ответ №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