ls -Al | while read string
do
...
done
,则仅输出文件和目录,不带空格。如果文件或目录中有“个人域”之类的空格,则只能是“个人”一词。
我需要一个非常简单的解决方案。也许有比awk更好的解决方案。
#1 楼
您真的不应该解析ls
的输出。如果这是家庭作业,您必须这样做,那么您的教授不知道他们在说什么。为什么不这样做:很好...
find ./ -printf "%f\n"
或
for n in *; do printf '%s\n' "$n"; done
...不好...
如果您真的想使用
ls
,可以通过执行以下操作使其更强大:ls -lA | awk -F':[0-9]* ' '/:/{print }'
...和丑陋的
如果您坚持以错误,危险的方式进行操作,而只需要使用
while
循环,就可以这个:ls -Al | while IFS= read -r string; do echo "$string" |
awk -F':[0-9]* ' '/:/{print }'; done
严重的是,只是不要。
评论
drwx ------ 2 s162103螺柱3 oct。 2012年9月9日。sshdrwxr-xr-x 3 s162103双头螺栓10月6日。 25 09:02 .subversion drwxrwxrwt 3 s162103螺柱11月3日。 15 2012 .TempoItems有时我的日期没有时间,只有年和gawk返回空
– Alex Zern
13年3月30日在16:30
@AlexZern好吧,这就是您不解析ls输出的原因之一。
– terdon♦
13年3月30日在16:33
@AlexZern为什么仍然需要-l开关?如果只需要文件名,则运行ls -A。使用-l只会使您的生活更加艰难,因为现在您必须解析输出。
– terdon♦
13年3月30日在16:37
因为我需要其他信息,例如访问权限,日期,所有者等。而且我写了一个巨大的脚本,除了打印文件和带空格的目录名之外,它都很好用。
– Alex Zern
13年3月30日在16:46
好吧。我们这里有一个XY问题。 ls并不是获取所需内容的最佳方法。您为什么不发布一个新问题来解释您想要收集的信息,我们会建议您这样做的方法。或者,您可以按原样使用脚本,并使用上面的建议之一仅打印名称。但是,认真的说,不要解析ls,只需告诉我们您在一个新问题中要做什么。
– terdon♦
2013年3月30日16:49
#2 楼
ls -A1
*不能工作是因为某些原因吗?例如:
$ touch file1 file2 file\ with\ spaces
$ ls -Al
total 0
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file1
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file2
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file with spaces
$ ls -A1
file1
file2
file with spaces
$
*注意:这是一个大写字母A和数字一。
评论
最干净的解决方案。谢谢
– Luciano Fantuzzi
20-2-26在22:34
完美运作。
–法汉·拉菲(Farhan A. Rafi)
20年8月13日在8:31
#3 楼
我不知道为什么没有人提到这个简单的命令:ls -a | sort
评论
辉煌!知道如何通过管道排序将多列块取消旋转为单列吗?
–msciwoj
16-09-14在10:49
@msciwoj它只接受由空格分隔的所有字符串,然后将它们打印出来,并以结尾行分隔
–本
16/09/14在12:32
之所以可以在这里使用,是因为ls的输出没有到达终端时,ls会恢复为ls -1(单列输出)(并禁用不可打印的字符引用/替换; @Kusalananda,您的ls如果仍然可以,则不符合POSIX) 。 ls输出已经排序。因此,以管道方式对其进行排序最多将无济于事,更糟糕的是,会破坏输出(如果文件名包含换行符),或者对非文本文件名失败。 ls -a |猫会更好。甚至已经提到的更好的ls -A1(并且因为您通常希望在终端上显示时使用替换/引用)
–StéphaneChazelas
18-3-23在11:22
@StéphaneChazelas注意。当输出不是终端时,ls的行为会有所不同。
– Kusalananda♦
18 Mar 23 '18 at 11:25
#4 楼
您无法解析ls
的输出,更不用说ls -l
了,因为换行符就像空格一样,就像文件名中的任何字符一样有效。另外,您还需要考虑符号链接,其输出类似于... foo -> bar
。如果只希望文件名,为什么仍要使用
-l
?只需:
for file in *; do
...
done
如果要包括点文件(
.
和..
除外),取决于外壳程序:zsh
:for file in *(ND); do
...
done
bash
:shopt -s nullglob dotglob
for file in *; do
...
done
ksh93
:FIGNORE='@(.|..)'
for file in ~(N)*; do
...
done
POSIXly:
for file in .[!.]* ..?* *; do
[ -e "$file" ] || [ -L "$file" ] || continue
...
done
#5 楼
ls -Al | tr -s ' ' | cut -f9- -d' '
用tr将多个空格压缩为单个空格,然后可以使用cut拆分字段
评论
在我只知道完整路径而不是文件名的情况下,cut效果最好。使用最新版本识别排序的完整命令:ls / workdir / node- * |切-f 3 -d / |排序-V -r |头-n 1
–塞缪尔·内夫(Samuel Neff)
20-2-5在20:23
#6 楼
尝试(bash
,zsh
,ksh93
语法): ...)。另请参见:
仅列出当前目录中的常规文件(但不列出目录)
为什么不应该在wooledge Wiki上解析ls(1)的输出?
为什么不解析
ls
?在Unix SE上#7 楼
打印目录中所有文件名的最简单方法可能是:echo *
缺点-不会打印隐藏文件。
评论
根据外壳的不同,可能有一些外壳选项可以设置以将模式扩展为隐藏名称(例如bash外壳中的dotglob),或者可以这样做的特殊模式(例如zsh外壳中的*(D))。这是另一个答案。
– Kusalananda♦
20-3-17在14:16
#8 楼
怎么样:for file in * .[!.]*
do
printf "%s\n" "$file"
done
评论
为什么不只是ls -Al *''*?解析ls的输出永远不会带来任何好处。如果您需要在任何* nix中都可以使用的东西,请尝试避免使用ls -Al |而。一种简单而可靠的方法是在*中输入字符串;回显“ $ string”;完成。
只需要这种结构即可。好吧,不是简单的任何解决方案!
为什么需要ls?解析ls和“在所有* nix中工作,并且如果发生什么事情也不会中断”不能很好地配合。
mywiki.wooledge.org/ParsingLs