好的,这是我第三次尝试发布这个,也许我问的是错误的问题!!
自从我完成任何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分隔)并吐出“文件名太长”错误。
想法?
答案 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命令中执行操作的经验有时会很慢,尽管它确实完成了工作。