我应该只使用这种结构来回显文件或目录的名称:例如,如果我尝试:

ls -Al | while read string
do
...
done


,则仅输出文件和目录,不带空格。如果文件或目录中有“个人域”之类的空格,则只能是“个人”一词。

我需要一个非常简单的解决方案。也许有比awk更好的解决方案。

评论

为什么不只是ls -Al *''*?解析ls的输出永远不会带来任何好处。

如果您需要在任何* nix中都可以使用的东西,请尝试避免使用ls -Al |而。一种简单而可靠的方法是在*中输入字符串;回显“ $ string”;完成。

只需要这种结构即可。好吧,不是简单的任何解决方案!

为什么需要ls?解析ls和“在所有* nix中工作,并且如果发生什么事情也不会中断”不能很好地配合。

mywiki.wooledge.org/ParsingLs

#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 楼

尝试(bashzshksh93语法): ...)。


另请参见:


仅列出当前目录中的常规文件(但不列出目录)

为什么不应该在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