查找重复的嵌套目录
Find duplicated nested directories
我有一个很大的目录树,其中包含重复的嵌套目录(但不是全部):
- data/home/home/
- data/banners/banners/
- resources/users/documents/documents/
如何通过此操作仅合并重复的目录:
- 复制(不替换)data/home/home/内容到data/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 是一个有效的文件夹,但被检测为重复。
谢谢。
你可以使用如下的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[[=12=]]++' | 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
我有一个很大的目录树,其中包含重复的嵌套目录(但不是全部):
- data/home/home/
- data/banners/banners/
- resources/users/documents/documents/
如何通过此操作仅合并重复的目录:
- 复制(不替换)data/home/home/内容到data/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 是一个有效的文件夹,但被检测为重复。
谢谢。
你可以使用如下的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[[=12=]]++' | 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