3

好的,这是我第三次尝试发布此内容,也许我问错了问题!

我已经有几年没有做过任何 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 分隔)并吐出“文件名太长”错误。

想法??

4

3 回答 3

4

我认为你可以在你的 find 命令中完成这一切。奥托姆:

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

希望我记得正确的语法。

于 2009-08-25T21:39:53.613 回答
1

你的命令

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

有参数“-0”到 xargs 但你没有告诉 find 到“-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。

于 2009-08-25T21:40:46.873 回答
1

使用 for 循环。

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

Xargs 存在来自管道的输入出现在命令末尾的问题。您想要的是多个命令,而不仅仅是 1 个命令。

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

于 2009-08-25T21:46:46.377 回答