如何把带空格的文件夹名字作为 for 的参数列表

sh/bash/dash/ksh/zsh等Shell脚本
头像
lucky_yjw
帖子: 129
注册时间: 2009-07-17 20:57

如何把带空格的文件夹名字作为 for 的参数列表

#1

帖子 lucky_yjw » 2009-07-18 18:45

如题,我尝试过以下语句
for i in `ls -al|grep ^d|awk '{print $8}'|xargs`
但当文件夹名字有空格(比如“New Volume”)的时候就会出错。大家帮帮忙想个办法,先谢了!
本科农民工:
钱少,事多,离家远....
位微,权轻,责任重....
新建的个人网站
头像
lucky_yjw
帖子: 129
注册时间: 2009-07-17 20:57

Re: 如何把带空格的文件夹名字作为 for 的参数列表

#2

帖子 lucky_yjw » 2009-07-18 18:45

自己先顶一下。
本科农民工:
钱少,事多,离家远....
位微,权轻,责任重....
新建的个人网站
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: 如何把带空格的文件夹名字作为 for 的参数列表

#3

帖子 tusooa » 2009-07-19 15:31

加引号
比如

代码: 全选

for i in "My Value" a b c d e f "g h i j k" lm
do
    echo $i
done

代码: 全选

] ls -ld //
头像
chenfengyuan的马甲
帖子: 25
注册时间: 2009-07-06 7:57

Re: 如何把带空格的文件夹名字作为 for 的参数列表

#4

帖子 chenfengyuan的马甲 » 2009-07-19 15:57

这样怎么样?
ls -al|grep ^d|awk '{print $8}'|xargs|while read a;do echo $a;done
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 如何把带空格的文件夹名字作为 for 的参数列表

#5

帖子 aerofox » 2009-07-20 8:54

用 ls 加管道是最坏的选择,得自己处理各种各样的特殊符号问题。

代码: 全选

for f in *; do echo "$f"; done
这个例子没处理隐藏文件,如果确实要处理隐藏文件,可以用 .[^.]* 来匹配。
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

Re: 如何把带空格的文件夹名字作为 for 的参数列表

#6

帖子 bones7456 » 2009-07-20 12:03

aerofox 写了:用 ls 加管道是最坏的选择,得自己处理各种各样的特殊符号问题。

代码: 全选

for f in *; do echo "$f"; done
这个例子没处理隐藏文件,如果确实要处理隐藏文件,可以用 .[^.]* 来匹配。
嗯,用find + -exec 就更强大了.
关注我的blog: ε==3
头像
lucky_yjw
帖子: 129
注册时间: 2009-07-17 20:57

Re: 如何把带空格的文件夹名字作为 for 的参数列表

#7

帖子 lucky_yjw » 2009-07-23 22:12

aerofox 写了:用 ls 加管道是最坏的选择,得自己处理各种各样的特殊符号问题。

代码: 全选

for f in *; do echo "$f"; done
这个例子没处理隐藏文件,如果确实要处理隐藏文件,可以用 .[^.]* 来匹配。
多谢了!
你的意思应该是这样吧? for f in * .*; do echo "$f"; done
但能不能只是一口气列出是文件夹的,不要列出文件文档之类的。
另外匹配隐藏文件,用 .* 就可以了吧?我试过没什么区别啊? 呵呵...
上次由 lucky_yjw 在 2009-07-23 22:21,总共编辑 1 次。
本科农民工:
钱少,事多,离家远....
位微,权轻,责任重....
新建的个人网站
头像
lucky_yjw
帖子: 129
注册时间: 2009-07-17 20:57

Re: 如何把带空格的文件夹名字作为 for 的参数列表

#8

帖子 lucky_yjw » 2009-07-23 22:13

bones7456 写了:
aerofox 写了:用 ls 加管道是最坏的选择,得自己处理各种各样的特殊符号问题。

代码: 全选

for f in *; do echo "$f"; done
这个例子没处理隐藏文件,如果确实要处理隐藏文件,可以用 .[^.]* 来匹配。
嗯,用find + -exec 就更强大了.
我就直说算了,我想递归比较两个目录之间的文件.
上次由 lucky_yjw 在 2009-07-23 23:18,总共编辑 1 次。
本科农民工:
钱少,事多,离家远....
位微,权轻,责任重....
新建的个人网站
头像
HuntXu
帖子: 5776
注册时间: 2007-09-29 3:09

Re: 如何把带空格的文件夹名字作为 for 的参数列表

#9

帖子 HuntXu » 2009-07-23 22:14

find ./ -type d...
HUNT Unfortunately No Talent...
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 如何把带空格的文件夹名字作为 for 的参数列表

#10

帖子 eexpress » 2009-07-23 22:14

如果是文件。

代码: 全选

ls -1 *|while read i; do
这样吧。否则,bash会扩展一切*号的。导致不对的。

就是一行一行读入。不管是find还是什么。管道都只搞整行处理的。

要不,来perl。
● 鸣学
billbear
帖子: 3681
注册时间: 2008-05-03 23:42

Re: 如何把带空格的文件夹名字作为 for 的参数列表

#11

帖子 billbear » 2009-07-24 0:01

但能不能只是一口气列出是文件夹的,不要列出文件文档之类的。
可以加个判断啊
for i in *; do
[ -d $i ] && echo $i
done
另外匹配隐藏文件,用 .* 就可以了吧?我试过没什么区别啊? 呵呵...
.* 里有 . 和 ..
要格外小心
一只眼曾经用 .* 误动了上层目录,看 viewtopic.php?f=123&t=189437
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: 如何把带空格的文件夹名字作为 for 的参数列表

#12

帖子 tusooa » 2009-07-24 14:26

lucky_yjw 写了:
aerofox 写了:用 ls 加管道是最坏的选择,得自己处理各种各样的特殊符号问题。

代码: 全选

for f in *; do echo "$f"; done
这个例子没处理隐藏文件,如果确实要处理隐藏文件,可以用 .[^.]* 来匹配。
多谢了!
你的意思应该是这样吧? for f in * .*; do echo "$f"; done
但能不能只是一口气列出是文件夹的,不要列出文件文档之类的。
另外匹配隐藏文件,用 .* 就可以了吧?我试过没什么区别啊? 呵呵...
那就

代码: 全选

for i in * 
do
    if [ -d $i ]
    then
        printf "$i/   "
    fi
done ;echo

代码: 全选

24/07/2009 14:26:25
tusooa (~/kde/src/koffice/build)
>> for i in *
> do
> if [ -d $i ]
> then
> printf "$i/  "
> elif [ -x $i ]
> then
> printf "$i*  "
> else
> printf "$i   "
> fi
> done ; echo
cmake/  CMakeCache.txt   CMakeFiles/  cmake_install.cmake   CMakeTmp/  cmake_uninstall.cmake   config-endian.h   config-openexr.h   config-opengl.h   config-prefix.h   CTestTestfile.cmake   doc/  filters/  interfaces/  karbon/  kchart/  kdgantt/  kexi/  kformula/  kivio/  kounavail/  kplato/  kpresenter/  kword/  lib/  libs/  Makefile   pics/  plugins/  servicetypes/  templates/  tools/
24/07/2009 14:27:34
tusooa (~/kde/src/koffice/build)
>>

代码: 全选

] ls -ld //
tubunu
帖子: 34
注册时间: 2009-07-13 11:49

Re: 如何把带空格的文件夹名字作为 for 的参数列表

#13

帖子 tubunu » 2009-07-24 17:19

可以用sed

目录建了个"test 1"

代码: 全选

ls -lt|grep "^d"
drwxr-x---   2 xxx     staff           256 Jul 24 05:18 test 1
drwxr-x---  10 xxx     staff          8192 Jul 09 21:38 jil
drwxr-x---   2 xxx     staff          4096 Apr 27 04:47 log
drwxr-x---   2 xxx     staff          4096 Mar 21 2008  drp_test.20080321
跳过前8段

代码: 全选

ls -lt|grep "^d"|sed 's/^\([^ ]* *\)\{8\}\(.*\)$/\2/'
test 1
jil
log
drp_test.20080321
头像
lucky_yjw
帖子: 129
注册时间: 2009-07-17 20:57

Re: 如何把带空格的文件夹名字作为 for 的参数列表

#14

帖子 lucky_yjw » 2009-07-26 0:19

tubunu 写了:可以用sed

目录建了个"test 1"

代码: 全选

ls -lt|grep "^d"
drwxr-x---   2 xxx     staff           256 Jul 24 05:18 test 1
drwxr-x---  10 xxx     staff          8192 Jul 09 21:38 jil
drwxr-x---   2 xxx     staff          4096 Apr 27 04:47 log
drwxr-x---   2 xxx     staff          4096 Mar 21 2008  drp_test.20080321
跳过前8段

代码: 全选

ls -lt|grep "^d"|sed 's/^\([^ ]* *\)\{8\}\(.*\)$/\2/'
test 1
jil
log
drp_test.20080321
对sed不太熟,呵呵...
如果有连续几个空格或者几个单词这样也可以吗?
本科农民工:
钱少,事多,离家远....
位微,权轻,责任重....
新建的个人网站
tubunu
帖子: 34
注册时间: 2009-07-13 11:49

Re: 如何把带空格的文件夹名字作为 for 的参数列表

#15

帖子 tubunu » 2009-07-27 9:51

lucky_yjw 写了:
tubunu 写了:可以用sed

目录建了个"test 1"

代码: 全选

ls -lt|grep "^d"
drwxr-x---   2 xxx     staff           256 Jul 24 05:18 test 1
drwxr-x---  10 xxx     staff          8192 Jul 09 21:38 jil
drwxr-x---   2 xxx     staff          4096 Apr 27 04:47 log
drwxr-x---   2 xxx     staff          4096 Mar 21 2008  drp_test.20080321
跳过前8段

代码: 全选

ls -lt|grep "^d"|sed 's/^\([^ ]* *\)\{8\}\(.*\)$/\2/'
test 1
jil
log
drp_test.20080321
对sed不太熟,呵呵...
如果有连续几个空格或者几个单词这样也可以吗?
可以的,上面定义的匹配模式是从开始找任意个非空格字符再加任意个空格字符,然后重复8次,再输出后面的所有字符,例如:
drwxr-x--- 2 xxx staff 256 Jul 24 05:18 test 1
'drwxr-x--- ','2 '等都是符合模式的,第8次就是'05:18 ',再输出后面的所有,就是目录名了。由于ls -l的输出是规范的,可以这样做。
回复