#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