bash脚本重命名当前目录中的所有文件以及层次结构中位于其上的所有目录?

bash脚本重命名当前目录中的所有文件以及层次结构中位于其上的所有目录?,bash,Bash,我编写了以下脚本来重命名当前目录中所有文件夹中的所有文件。但我遇到了问题,因为它不仅重命名了文件夹中的文件,还重命名了层次结构中当前目录和父目录中的所有文件夹。我意识到这是因为。和。。存在于当前目录中。但如何摆脱它们呢 for i in * do cd $i for j in * do mv $j $i$j done cd .. done 问题是,我有许多文件夹,其中包

我编写了以下脚本来重命名当前目录中所有文件夹中的所有文件。但我遇到了问题,因为它不仅重命名了文件夹中的文件,还重命名了层次结构中当前目录和父目录中的所有文件夹。我意识到这是因为。和。。存在于当前目录中。但如何摆脱它们呢

   for i in *
    do
        cd $i
        for j in *
        do
            mv $j $i$j
        done
        cd ..
    done

问题是,我有许多文件夹,其中包含名为image0001到image0100的图像。我想把所有的图片复制到一个文件夹。因此,它们正在相互覆盖。这就是我想重命名这些图像的原因。

我认为问题可能在于
cd$I
有时会失败(可能是因为
$I
不是目录?或者可能是因为它包含空格,所以会触发单词拆分?),所以您会留在同一个目录中,然后
cd..
向上移动一个目录

要解决此问题(以及可能出现的其他潜在问题),我建议您对脚本更加谨慎:

for dir in */ ; do
    pushd "$dir" || continue
    for file in image???? ; do
        mv "./$file" "${dir%/}$file"
    done
    popd
done

我认为问题可能在于,
cd$I
有时会失败(可能是因为
$I
不是一个目录?或者可能是因为它包含空格,所以会触发分词?),因此您会留在同一个目录中,然后
cd..
会将您上移到一个目录中

要解决此问题(以及可能出现的其他潜在问题),我建议您对脚本更加谨慎:

for dir in */ ; do
    pushd "$dir" || continue
    for file in image???? ; do
        mv "./$file" "${dir%/}$file"
    done
    popd
done

我认为bash不会扩展
您确定要使用
bash
?(
echo$BASH_版本
);是否启用了
dotglob
shopt dotglob
另外,请添加更多有关您希望如何重命名文件的详细信息。@konsolebox我为问题添加了更多详细信息。而dotglob是关闭的。同样在回显$BASH_版本时,我得到了4.2.25(1),您可以检查它是否是一个目录。e、 g.:
人工测试
不仅仅是
bash
;禁止
*
匹配首字母
。我认为bash不会扩展
您确定要使用
bash
?(
echo$BASH_版本
);是否启用了
dotglob
shopt dotglob
另外,请添加更多有关您希望如何重命名文件的详细信息。@konsolebox我为问题添加了更多详细信息。而dotglob是关闭的。同样在回显$BASH_版本时,我得到了4.2.25(1),您可以检查它是否是一个目录。e、 g.:
人工测试
不仅仅是
bash
;禁止
*
匹配首字母