sh/bash/dash/ksh/zsh等Shell脚本
-
fanhe
- 帖子: 2357
- 注册时间: 2007-03-24 23:45
#1
帖子
由 fanhe » 2010-07-20 23:05
例如有一个文件叫 "a b c"
我这样
会提示没有a,b和c文件的
我现在就是想让xargs处理的每个参数带上引号或者把每个参数的空格换成转义空格,能解决吗?
-
aerofox
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
#2
帖子
由 aerofox » 2010-07-21 6:22
xargs 后加 -0 的前提是给它的输入是以 ASCII 码 0 分隔的。
-
fanhe
- 帖子: 2357
- 注册时间: 2007-03-24 23:45
#3
帖子
由 fanhe » 2010-07-21 19:03
aerofox 写了:
xargs 后加 -0 的前提是给它的输入是以 ASCII 码 0 分隔的。
这样更加不可能,不佳-0参数,也就是把"a b c"当成三个参数传给ls了,你加-t -n1参数去试下就知道了
看来文件名空格问题真是很麻烦的问题啊
-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#5
帖子
由 eexpress » 2010-07-21 22:11
此命令,几乎过时了的。
● 鸣学
-
fanhe
- 帖子: 2357
- 注册时间: 2007-03-24 23:45
#6
帖子
由 fanhe » 2010-07-22 19:36
aerofox 写了:那条命令我是试过的,没有问题。
不好意思,我没看清楚
原来是ls -Q
但是这个只是对前一个命令的修正而已,治标不治本啊,xargs还是办不到啊
-
BigSnake.NET
- 帖子: 12522
- 注册时间: 2006-07-02 11:16
- 来自: 廣州
-
联系:
#7
帖子
由 BigSnake.NET » 2010-07-22 19:41
这样是不行的, 因为 ls 的输出中文件名的空格和分割文件名的空格不可分辨(当然,输出到管道的话ls的文件名是用换行分割的,那么文件名中有换行呢,一样没办法)
正解是使用 find
find ..... -exec ... {} \;
或者
find ... -print0 ... | xargs -0 ....
^_^ ~~~
要理解递归,首先要理解递归。
地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
-
aerofox
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
#8
帖子
由 aerofox » 2010-07-23 5:42
代码: 全选
$ touch "a b c" "d e f"
$ ls -Q | xargs -t -n1 ls -l
ls -l a b c
-rw-r--r-- 1 ubuntu ubuntu 0 07-23 05:35 a b c
ls -l d e f
-rw-r--r-- 1 ubuntu ubuntu 0 07-23 05:35 d e f
当然,用 find 更好,我这个例子只是忠实地实现楼主这个想法:
让xargs处理的每个参数带上引号或者把每个参数的空格换成转义空格
-
fanhe
- 帖子: 2357
- 注册时间: 2007-03-24 23:45
#9
帖子
由 fanhe » 2010-07-23 21:35
aerofox 写了:代码: 全选
$ touch "a b c" "d e f"
$ ls -Q | xargs -t -n1 ls -l
ls -l a b c
-rw-r--r-- 1 ubuntu ubuntu 0 07-23 05:35 a b c
ls -l d e f
-rw-r--r-- 1 ubuntu ubuntu 0 07-23 05:35 d e f
当然,用 find 更好,我这个例子只是忠实地实现楼主这个想法:
让xargs处理的每个参数带上引号或者把每个参数的空格换成转义空格
那句话的确是我说的,但我的意思是让xargs来实现…
例子的那个ls只是演示而已,目的不在于ls,而是xargs
看来xargs的功能还是不行啊,只能换其他了
-
aerofox
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
#10
帖子
由 aerofox » 2010-07-24 5:25
下面是一个不含 ls 的例子:
代码: 全选
$ touch 'a b c'
$ dd if=/dev/zero of='d e f' bs=1024 count=1
1+0 records in
1+0 records out
1024 bytes (1.0 kB) copied,3.3768e-05 秒,30.3 MB/秒
$ ls > 'g h'
$ echo "'a b c' 'd e f' 'g h'" | xargs -t -n1 file
file a b c
a b c: empty
file d e f
d e f: data
file g h
g h: ASCII text
-
tusooa
- 帖子: 6548
- 注册时间: 2008-10-31 22:12
- 系统: 践兔
-
联系:
#11
帖子
由 tusooa » 2010-07-27 23:33
代码: 全选
tlcr: 0 庚寅年六月十七日 23:29:24 /tmp/test
>> touch 'a b' 'c d'
tlcr: 0 庚寅年六月十七日 23:29:30 /tmp/test
>> ls -1 | perl -e 'while(<STDIN>){chomp; system("ls -d \"$_\"");}'
a b
c d
-
DerekTan
- 帖子: 33
- 注册时间: 2007-05-22 10:48
-
联系:
#12
帖子
由 DerekTan » 2010-08-11 11:05
咦,没人回复 ls | xargs -I{} ls {} 吗?
-
fanhe
- 帖子: 2357
- 注册时间: 2007-03-24 23:45
#13
帖子
由 fanhe » 2010-10-11 15:17
DerekTan 写了:咦,没人回复 ls | xargs -I{} ls {} 吗?
要的就是这个答案
其实我用来转 axel的,我不明白为什么我在axel 后面加了多个地址,但axel只下载第一个文件,我很不明白