1

我必须解析ls -Al output并获取文件或目录名称

ls -Al输出 :

drwxr-xr-x  12 s162103  studs         12 march 28 2012 personal domain
drwxr-xr-x   2 s162103  studs          3 march 28 22:32 public_html
drwxr-xr-x   7 s162103  studs          8 march 28 13:59 WebApplication1

我应该只使用ls -Al | <something>

例如:

ls -Al | awk '{print $8}'

但这不起作用,因为$8如果目录名称中有空格,则不是名称,它是名称的一部分。也许有一些实用程序可以删除姓氏或删除之前的任何内容?我需要找到任何解决方案。请帮忙!

已编辑:我知道什么 parse ls -Al 是个坏主意,但我应该用上面的构造完全解析它!没有办法使用这样的东西

for f in *; do
    somecommand "$f"
done
4

5 回答 5

4

ls -Al如果您只需要文件名,请不要解析。

您可以将所有文件名放在一个数组中:

files=( * )

或者您可以直接遍历文件:

for f in *; do
    echo "$f"
done

如果ls您需要某些特定内容,请更新您的问题以指定您需要什么。

于 2013-03-30T18:32:21.963 回答
3

这个怎么样,ls -Al |awk '{$1=$2=$3=$4=$5=$6=$7=$8="";print $0}' 我知道这是一个便宜的把戏,但既然你不想使用任何东西,除了ls -Al我想不出更好的东西......

于 2013-03-30T19:42:20.880 回答
2

根据@squiguy对评论的请求,我发表我的评论作为答案:

就这个怎么办?

  ls -1A

而不是l(L,字母),a 1(一,数字)。它只会列出文件的名称。

于 2013-03-30T18:36:31.747 回答
1

还值得注意的是,find可以做你正在寻找的东西:

此目录中的所有内容,相当于ls

find . -maxdepth 1

递归,类似于ls -R

find .

只有给定目录中的目录:

find /path/to/some/dir -maxdepth 1 -type d

md5sum每个常规文件:

find . -type f -exec md5sum {} \;
于 2013-03-30T18:38:23.597 回答
0

希望 awk 适合你:

ls -Al | awk 'NR>1{for(i=9;i<NF;i++)printf $i" ";print $i}'

如果您对 sed 感兴趣:

ls -Al | sed '1d;s/^\([^ ]* *\)\{8\}//'
于 2013-03-31T13:55:52.423 回答