xargs怎么处理带空格的参数?

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

xargs怎么处理带空格的参数?

#1

帖子 fanhe » 2010-07-20 23:05

例如有一个文件叫 "a b c"
我这样

代码: 全选

ls | xargs -0 ls
会提示没有a,b和c文件的
我现在就是想让xargs处理的每个参数带上引号或者把每个参数的空格换成转义空格,能解决吗?
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: xargs怎么处理带空格的参数?

#2

帖子 aerofox » 2010-07-21 6:22

代码: 全选

ls -Q | xargs ls
xargs 后加 -0 的前提是给它的输入是以 ASCII 码 0 分隔的。
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: xargs怎么处理带空格的参数?

#3

帖子 fanhe » 2010-07-21 19:03

aerofox 写了:

代码: 全选

ls -Q | xargs ls
xargs 后加 -0 的前提是给它的输入是以 ASCII 码 0 分隔的。
这样更加不可能,不佳-0参数,也就是把"a b c"当成三个参数传给ls了,你加-t -n1参数去试下就知道了
看来文件名空格问题真是很麻烦的问题啊
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: xargs怎么处理带空格的参数?

#4

帖子 aerofox » 2010-07-21 21:15

那条命令我是试过的,没有问题。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: xargs怎么处理带空格的参数?

#5

帖子 eexpress » 2010-07-21 22:11

此命令,几乎过时了的。
● 鸣学
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: xargs怎么处理带空格的参数?

#6

帖子 fanhe » 2010-07-22 19:36

aerofox 写了:那条命令我是试过的,没有问题。
不好意思,我没看清楚
原来是ls -Q
但是这个只是对前一个命令的修正而已,治标不治本啊,xargs还是办不到啊
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: xargs怎么处理带空格的参数?

#7

帖子 BigSnake.NET » 2010-07-22 19:41

这样是不行的, 因为 ls 的输出中文件名的空格和分割文件名的空格不可分辨(当然,输出到管道的话ls的文件名是用换行分割的,那么文件名中有换行呢,一样没办法)

正解是使用 find

find ..... -exec ... {} \;
或者
find ... -print0 ... | xargs -0 ....
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: xargs怎么处理带空格的参数?

#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

Re: xargs怎么处理带空格的参数?

#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

Re: xargs怎么处理带空格的参数?

#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
系统: 践兔
联系:

Re: xargs怎么处理带空格的参数?

#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

代码: 全选

] ls -ld //
DerekTan
帖子: 33
注册时间: 2007-05-22 10:48
联系:

Re: xargs怎么处理带空格的参数?

#12

帖子 DerekTan » 2010-08-11 11:05

咦,没人回复 ls | xargs -I{} ls {} 吗?
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: xargs怎么处理带空格的参数?

#13

帖子 fanhe » 2010-10-11 15:17

DerekTan 写了:咦,没人回复 ls | xargs -I{} ls {} 吗?
要的就是这个答案

其实我用来转 axel的,我不明白为什么我在axel 后面加了多个地址,但axel只下载第一个文件,我很不明白
回复