Bash脚本自动为树中的子目录创建符号链接

时间:2009-08-25 21:33:37

标签: bash whitespace symlink

好的,这是我第三次尝试发布这个,也许我问的是错误的问题!!

自从我完成任何shell编程已经有几年了,所以我有点生疏......

我正在尝试创建一个简单的shell脚本,找到树中某个命名子目录下的所有子目录,并创建指向这些目录的符号链接(听起来比它更混乱)。我在Windows XP上使用cygwin。

这个find / grep命令找到文件系统中的目录,就像我想要的那样:

find -mindepth 3 -maxdepth 3 -type d | grep "New Parts"

现在是困难的部分...我只想拿这个列表,把它管道输入ln并创建一些符号链接。目录列表有一些空格,所以我试图用xargs来清理一下:

find -mindepth 3 -maxdepth 3 -type d | grep "New Parts" | xargs -0 ln -s -t /cygdrive/c/Views

不幸的是,ln吐出一长串连接在一起的所有目录(由\ n分隔)并吐出“文件名太长”错误。

想法?

3 个答案:

答案 0 :(得分:4)

我认为你可以在find命令中完成所有这些操作。 OTTOMH:

find -mindepth 3 -maxdepth 3 -type d -name "*New Parts*" -exec ln -s -t /cygdrive/c/Views {} \;

希望我记得这句法合适。

答案 1 :(得分:1)

你的命令

find -mindepth 3 -maxdepth 3 -type d | grep "New Parts" | xargs -0 ln -s -t /cygdrive/c/Views

对xargs有参数“-0”,但是你没有告诉发现“-print0”(如果你做grep无法在中间的管道中工作)。你想要的是以下我想:

find -mindepth 3 -maxdepth 3 -type d | grep "New Parts" | tr '\012' '\000' | xargs -0 ln -s -t /cygdrive/c/Views

tr命令会将换行符转换为ascii null。

答案 2 :(得分:1)

使用for循环。

for name in $(find $from_dir -mindepth 3 -maxdepth 3 -type d); do
  ln -s $name $to_dir
done

Xargs遇到管道输入在命令末尾的问题。你想要的是多个命令,而不仅仅是1个命令。

我在find命令中执行操作的经验有时会很慢,尽管它确实完成了工作。