可以使ls -l用制表符而不是空格来分隔字段以使输出在电子表格中有用吗?


10

如何ls -l使用制表符(而不是空格)将输出修改为单独的字段?我想将输出粘贴到电子表格中;带有可变数量空格的填充很难做到这一点。为了显示:

drwxr-xr-x 2根根4096 Sep 26 11:43 wpa_supplicant
-rw-r ----- 1个根拨出66 Sep 26 11:43 wvdial.conf
drwxr-xr-x 9根根4096 Oct 8 08:21 X11
drwxr-xr-x 12根根4096 Feb 18 23:31 xdg
drwxr-xr-x 2根根4096 Jan 31 06:11 xml
drwxr-xr-x 2根根4096 Nov 22 07:26 xul-ext
-rw-r--r-- 1个根root 349 2012年1月13日zsh_command_not_found

ls -l /etc上面的摘录中,第1、2和3行在第2列中有一个数字,而第4行有2个数字。这意味着可以通过使用两个空格来分隔1-3行中的第1列和第2列,而在第4行中仅使用一个空格来实现对齐。

ls 

Answers:


3

我已经做了同样的shell脚本。当文件名包含空格或任何其他特殊字符时,它会受到照顾。

#!/ bin / bash

SAVEIFS = $ IFS
IFS = $(echo -en“ \ n \ b”)
用于$(ls)中的文件
做
    stat --printf =“%A \ t%h \ t%U \ t%G \ t%s \ t” $ file
    mod_epoch = $(stat --format =“%Y” $ file)
    mod_month = $(日期-d @ $ mod_epoch +“%b”)
    mod_day = $(日期-d @ $ mod_epoch +“%d”)
    mod_time = $(日期-d @ $ mod_epoch +“%H:%M”)
    printf“%s \ t%s \ t%s \ t%s \ n” $ mod_month $ mod_day $ mod_time $ file
做完了
IFS = $ SAVEIFS
  • 将其保存到文件,例如 ls_tab.sh
  • 使它可执行:
chmod + x ls_tab.sh
  • 运行:
./ls_tab.sh

注意:这可以通过解析的输出来完成ls,但是此处给出不这样做的原因。


1
如果目标是要知道什么ls,解析它的输出是罚款。这很少是目标。可以说是在这里。我认为您使用的方法是相当不错的(鉴于某些需求,任何方法都会产生不想要的结果)!但是,可以说解析ls可能更好。考虑文件名中实际上带有制表符的情况。ls -l?字符替换选项卡。您的脚本保留制表符,如果其输出被解释为制表符并用于创建电子表格,则会创建额外的列。如果文件名包含换行符,它将严重降级。
伊利亚·卡根

1
真正。但是通常文件没有名称\n\t名称。如果这样做,则ls使用简单的bash命令解析输出将更加复杂,但是可以实现。如果OP要处理此类情况,我可以更新答案。
绿色

这对我有用,其中长空格的文件名正确显示。我的用法相当简单,我希望不会处理与文件\n,并\t在他们的名字。

1
完善。对于Windows speadsheet,使用printf "%s\t%s\t%s\t%s\r\n" $mod_month $mod_day $mod_time $file并将文件重定向为ouptut ./ls_tab.sh > listing.txt
Fedir RYKHTIK 2013年

6

尝试:

ls -l | awk -v OFS="\t" '$1=$1'

或者,如果文件名包含空格:

ls -l | awk '{print $1,"\t",$2,"\t",$3,"\t",$4,"\t",$5,"\t",$6,"\t",$7,"\t",$8,"\t",$9,$10,$11,$12,$13,$14,$15;}'

+1。完美运作。这种事情恰恰awk是为了什么。聪明!
tgies

不幸的是,这对于包含空格的文件名无法正常工作。它也用制表符替换它们。尽管它比green7的基于脚本的解决方案更简单并且运行速度更快,但是这将在大量时间内产生错误的输出,并且与Aditya的方法相比没有任何优势。是否可以对此进行修改,以便在第9列之后不再将空格解释为输入分隔符?
Eliah Kagan 2013年

1
请查看更新
philshem 2013年

@ psny18更新后的方法更糟。它会截断每个文件名的第一个单词以外的所有内容。简单地编写$9并不会改变您awk始终将空格解释为表示各列之间的中断这一事实。$9仅捕获该位置的第一个单词,并且由于其他单词被视为单独的,编号较高的列,因此根本不会打印它们。
Eliah Kagan

遗憾的是,即使文件名中包含空格,也不将其视为一列。

1

我们甚至不需要将输出转换为制表符分隔。列之间的空间就足够了。

ls -l像往常一样在终端中运行命令,然后将希望粘贴的内容复制到电子表格中。

终端命令

接下来,打开您的电子表格程序(在我的情况下为LibreOffice Calc),然后按Ctrl+ V粘贴剪贴板中的内容。

文本导入向导将弹出。确保在旁边打勾Space,然后按Ok。您可以在下部窗格中观看预览。

Libo文字汇入


1
当文件名带有空格时,这将不起作用
绿色的“

@ green7:啊..没意识到!:-)
阿迪亚(Aditya)2013年

不仅文件名,而且列中的字符数也是如此。如果选择“空格”作为定界符,则在此处和其他位置进行填充会引起问题。我将编辑问题来说明这一点。

0

python对此有好处:

# python
import os

os.system( 'ls -lR --time-style=full-iso /home/jw > ls_dump.txt')

folder = ''

for line in open('ls_dump.txt', 'r'):

    inrec = line.split()

    if inrec == []:
        continue

    if inrec[0].startswith('total'):
        continue

    if inrec[0].endswith(':'):
        folder = inrec[0].replace(':','')
        continue

    outline = folder + '\t' + '\t'.join(inrec[0:8]) +'\t'+ ' '.join(inrec[8:]) 

    print( outline )
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.