书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

sh/bash/dash/ksh/zsh等Shell脚本
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

#1

帖子 cao627 » 2012-03-27 14:51

从书上学到一条命令,如下

代码: 全选

find /home/someone -type d  | sed 's;/home/someone/;/home/someone/lt/;' | sed 's/^/mkdir -p  /' | sh -x
其中 /home/someone为当前用户的家目录

功能是find所有 /home/someone目录下的文件夹,
然后经过两道sed的工序的处理,将找到的文件夹创建在/home/someone/lt/目录下

但是执行这条命令时 /home/someone下会创建出许多空文件夹来。
从命令来理解/home/someone目录下除了创建的lt文件夹,不会再有别的文件夹创建。
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: 书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

#2

帖子 枫叶饭团 » 2012-03-27 15:45

技术不过关,没看出来。把这命令分拆出来一步一步的看输出应该很容易找出问题
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

#3

帖子 cao627 » 2012-03-27 16:37

枫叶饭团 写了:技术不过关,没看出来。把这命令分拆出来一步一步的看输出应该很容易找出问题
一步一步分过了
没查到mkdir 在/home/someone下直接创建的文件夹的输出
所有的行都被替换成了mkdir -p /home/someone/lt/...
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: 书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

#4

帖子 枫叶饭团 » 2012-03-27 16:49

那些空文件夹的名字呢?
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

#5

帖子 lilydjwg » 2012-03-27 17:00

枫叶饭团 写了:那些空文件夹的名字呢?
看样子是遇到空格了。
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

#6

帖子 cao627 » 2012-03-27 17:06

枫叶饭团 写了:那些空文件夹的名字呢?
One Data Explorer Files Internet Nemu Servers .....
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

#7

帖子 cao627 » 2012-03-27 17:16

lilydjwg 写了:
枫叶饭团 写了:那些空文件夹的名字呢?
看样子是遇到空格了。
你是说包含空格的文件夹名吗

find 找的是 /home/someone下的文件夹

所以find的输出行都是 以/home/someone/开头
然后替换成 以mkdir -p /home/someone/lt/开头

这和空格有什么关系
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

#8

帖子 lilydjwg » 2012-03-27 18:17

cao627 写了:
lilydjwg 写了:
枫叶饭团 写了:那些空文件夹的名字呢?
看样子是遇到空格了。
你是说包含空格的文件夹名吗

find 找的是 /home/someone下的文件夹

所以find的输出行都是 以/home/someone/开头
然后替换成 以mkdir -p /home/someone/lt/开头

这和空格有什么关系

代码: 全选

mkdir -vp /home/someone/lt/Whitespace Matters
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

#9

帖子 cao627 » 2012-03-27 18:20

lilydjwg 写了:
cao627 写了:
lilydjwg 写了:
枫叶饭团 写了:那些空文件夹的名字呢?
看样子是遇到空格了。
你是说包含空格的文件夹名吗

find 找的是 /home/someone下的文件夹

所以find的输出行都是 以/home/someone/开头
然后替换成 以mkdir -p /home/someone/lt/开头

这和空格有什么关系

代码: 全选

mkdir -vp /home/someone/lt/Whitespace Matters
懂了 谢谢
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

#10

帖子 aerofox » 2012-03-27 19:32

其实对于这种问题,解决办法的第一步应该是去掉最后一个管道(| sh -x),这样就把那些命令列出来了,一看就知道哪里有问题。

另外,两个 sed 可以合为一个,因为一个 sed 内部可以有两条 s 命令。
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

#12

帖子 cao627 » 2012-03-28 19:32

看过了

代码: 全选

find  ....  -exec mkdir ....{} \;
看来find命令的作者是考虑到并解决了空格文件名带来的麻烦的
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

#13

帖子 lilydjwg » 2012-03-28 19:39

cao627 写了:看过了

代码: 全选

find  ....  -exec mkdir ....{} \;
看来find命令的作者是考虑到并解决了空格文件名带来的麻烦的
你错了,find 命令根本不用管这个,因为它只需要把 {} 替换成文件名就可以了。find 并不会调用 shell,而是直接 execv,所以毫无问题。
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

#14

帖子 cao627 » 2012-03-28 19:51

lilydjwg 写了:
cao627 写了:看过了

代码: 全选

find  ....  -exec mkdir ....{} \;
看来find命令的作者是考虑到并解决了空格文件名带来的麻烦的
你错了,find 命令根本不用管这个,因为它只需要把 {} 替换成文件名就可以了。find 并不会调用 shell,而是直接 execv,所以毫无问题。

代码: 全选

mkdir -vp /home/someone/lt/Whitespace Matters
这条命令会这样执行:
在 /home/someone/lt/目录下创建Whitespace
在当前目录下创建Matters

如果{}只是简单把find找到的内容替换进来,那么我也会在执行find .... -exec mkdir ....{} \;后,在当前目录下生成类似Matters这种由于文件名空格产生的文件
但是没有,说明{}解决了这个问题,而{}是find的一部分,所以 说:“看来find命令的作者是考虑到并解决了空格文件名带来的麻烦的”
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: 书上学到的一条命令,将一个目录下的目录树,创建到另一个目录下,但有点不解。

#15

帖子 自由建客 » 2012-03-28 20:39

cao627, 你没理解那个道道
回复