Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash:递归地将目录名缩短为前10个字符_Bash - Fatal编程技术网

bash:递归地将目录名缩短为前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 '????

我需要递归地将所有子目录重命名为原始子目录名的前10个字符

例如,以下目录:

/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
选项
查找
。我不知道为什么我的答案被否决了。嘿,投票人,如果你不同意,请说清楚,