重命名csh shell中的所有子目录

时间:2014-02-04 15:41:34

标签: unix command-line rename csh batch-rename

我正在使用csh,我有一个包含多个子目录的目录结构。我正在尝试重命名所有目录和子目录,但不重命名这些目录中的文件。像

这样的东西

topdir1
--dir11
--dir12
topdir2
--dir21
----dir211
--dir22

topdir1.test
--dir11.test
--dir12.test
topdir2.test
--dir21.test
----dir211.test
--dir22.test

我可以使用find列出目录。 -maxdepth 3-type d。我正在尝试使用foreach循环来重命名它们。所以

foreach i (`find . -maxdepth 3 -type d`)
mv $i $i.test
end

但这不起作用,因为一旦重命名顶级目录,它就找不到子目录,所以它只重命名顶级目录。

有关如何解决这个问题的想法吗?

由于

3 个答案:

答案 0 :(得分:2)

如何反转查找结果以便首先列出子目录?

foreach i (`find ./* -maxdepth 3 -type d | sort -r`)
mv $i $i.test
end

Sort将最后输出最长的目录名,使用-r(反向)标志更改它,以便首先列出最低目录,并在其父目录之前重命名。

答案 1 :(得分:1)

使用-depth选项查找。

来自solaris man find页面:

 -depth              Always  true.  Causes  descent  of   the
                     directory  hierarchy  to be done so that
                     all entries in a directory are acted  on
                     before  the  directory itself.  This can
                     be useful when find is used with cpio(1)
                     to  transfer files that are contained in
                     directories without write permission.

答案 2 :(得分:0)

为什么要使用循环?让find完成工作:

find . -depth -maxdepth 3 -type d -exec mv {} {}.test \;

这不是严格可移植的(某些find的实现可能在法律上不会将{}.test扩展到您想要的字符串,因此您可能更喜欢:

find . -depth -maxdepth 3 -type d -exec sh -c 'mv $0 $0.test' {} \;