Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/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
Shell 使用前缀Unix批量重命名目录_Shell_Unix - Fatal编程技术网

Shell 使用前缀Unix批量重命名目录

Shell 使用前缀Unix批量重命名目录,shell,unix,Shell,Unix,我正在尝试在Unix中使用前缀批量重命名目录。像abc这样的前缀- 所以如果当前目录是123,我想把它改成abc-123,等等 我试过了 for d in $(find . -name '*' -type d) ; do mv $d $(echo $d | sed 's/$d/abc-$d/g') done 但这不起作用。很少编写shell脚本,因此我们将非常感谢您的帮助。 重命名命令不可用 谢谢大家! 试试看: for d in $(find . -depth -type d); do

我正在尝试在Unix中使用前缀批量重命名目录。像abc这样的前缀-

所以如果当前目录是123,我想把它改成abc-123,等等

我试过了

for d in $(find . -name '*' -type d) ; do
mv $d $(echo $d | sed 's/$d/abc-$d/g')
done
但这不起作用。很少编写shell脚本,因此我们将非常感谢您的帮助。 重命名命令不可用

谢谢大家!

试试看:

for d in $(find . -depth -type d); do
    b=$(basename $d)
    p=$(dirname $d)
    mv -v $d $p/abc-$b
done
请注意,
-depth
参数非常重要:它确保从下到上处理目录,以便您在重命名父目录之前重命名子目录。如果您不这样做,那么您将尝试重命名不再存在的路径

另外,我建议将第4行替换为

    echo "mv -v $d $p/abc-$b"

然后先运行这个版本的循环,这样你就可以在真正尝试之前看到它会做什么。

如果我理解你的问题,你可以用一行代码和
find-exec
这样做

find . -type d -depth -execdir mv {} abc-{} \;

你用哪种外壳?例如,在zsh中,这是简单的-
zmv-Q'(*)(/)'abc-$1'
。在bash中,它更复杂,正确地执行它需要一个循环。+1,但为了更好地支持递归情况,请使用
-execdir
,并添加
-depth
mv:rename。至abc-:无效参数
mv:rename./dir to abc-./x-dir:没有这样的文件或目录。
-depth-execdir
将修复除
之外的所有问题。这非常有效,谢谢!不支持verbose标志,但这很好,另外,我只重命名顶级目录。标记作为答案。