bash:递归地将目录名缩短为前10个字符
我需要递归地将所有子目录重命名为原始子目录名的前10个字符 例如,以下目录:bash:递归地将目录名缩短为前10个字符,bash,Bash,我需要递归地将所有子目录重命名为原始子目录名的前10个字符 例如,以下目录: /Documents/super-long-folder-name/other-folder-name/ 将更名为: /Documents/super-long/other-fold/ 我找到了一种方法将文件重命名为原始文件名的前10个字符,但现在我需要对目录执行此操作 为了递归重命名文件名,我安装了perl重命名函数:brew install rename,然后执行以下代码: find . -path '????
/Documents/super-long-folder-name/other-folder-name/
将更名为:
/Documents/super-long/other-fold/
我找到了一种方法将文件重命名为原始文件名的前10个字符,但现在我需要对目录执行此操作
为了递归重命名文件名,我安装了perl重命名函数:brew install rename
,然后执行以下代码:
find . -path '????????????????????*' -exec rename 's/^(.{10}).*(\..*)$/$1$2/' * {} \;
上面的代码查找文件路径大于20个字符的文件,然后将文件重命名为原始文件名的前10个字符
现在我正试图找到一个类似的解决方案,允许我对目录名执行此操作
提前感谢您提供的任何见解 请尝试以下操作:
#!/bin/bash
finddir="."
# calculate the max depth
depth=1
while IFS= read -r -d "" dir; do
str="${dir//[^\/]}"
if (( depth < ${#str} )); then
depth=${#str}
fi
done < <(find "$finddir" -type d -links 2 -print0)
# change long dirnames by starting with depth=1 incrementally
for (( i=1; i<=depth; i++ )); do
while IFS= read -r -d "" dir; do
stem=${dir%/*} # parent dir
leaf=${dir##*/} # current target dir
if (( ${#leaf} > 10 )); then
short=${leaf:0:10}
if [[ -d $stem/$short ]]; then
echo "$stem/$short exists. $stem/$leaf unchanged."
else
mv -- "$stem/$leaf" "$stem/$short"
# echo mv "$stem/$leaf" "$stem/$short"
fi
fi
done < <(find "$finddir" -type d -mindepth "$i" -maxdepth "$i" -print0)
done
#/bin/bash
finddir=“”
#计算最大深度
深度=1
而IFS=read-r-d“dir;做
str=“${dir/[^\/]}”
如果((深度<${str}));然后
深度=${str}
fi
完成-depth
选项查找。我不知道为什么我的答案被否决了。嘿,投票人,如果你不同意,请说清楚,