我正在使用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
但这不起作用,因为一旦重命名顶级目录,它就找不到子目录,所以它只重命名顶级目录。
有关如何解决这个问题的想法吗?
由于
答案 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' {} \;