分页: 1 / 2

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

发表于 : 2009-07-18 18:45
lucky_yjw
如题,我尝试过以下语句
for i in `ls -al|grep ^d|awk '{print $8}'|xargs`
但当文件夹名字有空格(比如“New Volume”)的时候就会出错。大家帮帮忙想个办法,先谢了!

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

发表于 : 2009-07-18 18:45
lucky_yjw
自己先顶一下。

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

发表于 : 2009-07-19 15:31
tusooa
加引号
比如

代码: 全选

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

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

发表于 : 2009-07-19 15:57
chenfengyuan的马甲
这样怎么样?
ls -al|grep ^d|awk '{print $8}'|xargs|while read a;do echo $a;done

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

发表于 : 2009-07-20 8:54
aerofox
用 ls 加管道是最坏的选择,得自己处理各种各样的特殊符号问题。

代码: 全选

for f in *; do echo "$f"; done
这个例子没处理隐藏文件,如果确实要处理隐藏文件,可以用 .[^.]* 来匹配。

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

发表于 : 2009-07-20 12:03
bones7456
aerofox 写了:用 ls 加管道是最坏的选择,得自己处理各种各样的特殊符号问题。

代码: 全选

for f in *; do echo "$f"; done
这个例子没处理隐藏文件,如果确实要处理隐藏文件,可以用 .[^.]* 来匹配。
嗯,用find + -exec 就更强大了.

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

发表于 : 2009-07-23 22:12
lucky_yjw
aerofox 写了:用 ls 加管道是最坏的选择,得自己处理各种各样的特殊符号问题。

代码: 全选

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

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

发表于 : 2009-07-23 22:13
lucky_yjw
bones7456 写了:
aerofox 写了:用 ls 加管道是最坏的选择,得自己处理各种各样的特殊符号问题。

代码: 全选

for f in *; do echo "$f"; done
这个例子没处理隐藏文件,如果确实要处理隐藏文件,可以用 .[^.]* 来匹配。
嗯,用find + -exec 就更强大了.
我就直说算了,我想递归比较两个目录之间的文件.

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

发表于 : 2009-07-23 22:14
HuntXu
find ./ -type d...

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

发表于 : 2009-07-23 22:14
eexpress
如果是文件。

代码: 全选

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

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

要不,来perl。

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

发表于 : 2009-07-24 0:01
billbear
但能不能只是一口气列出是文件夹的,不要列出文件文档之类的。
可以加个判断啊
for i in *; do
[ -d $i ] && echo $i
done
另外匹配隐藏文件,用 .* 就可以了吧?我试过没什么区别啊? 呵呵...
.* 里有 . 和 ..
要格外小心
一只眼曾经用 .* 误动了上层目录,看 viewtopic.php?f=123&t=189437

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

发表于 : 2009-07-24 14:26
tusooa
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)
>>

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

发表于 : 2009-07-24 17: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

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

发表于 : 2009-07-26 0:19
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不太熟,呵呵...
如果有连续几个空格或者几个单词这样也可以吗?

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

发表于 : 2009-07-27 9:51
tubunu
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的输出是规范的,可以这样做。