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

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

如何修改输出ls -l以使用制表符而不是空格来分隔字段?我想将输出粘贴到电子表格中;填充可变数量的空格使这样做很困难。为了说明:

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

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

答案1

尝试:

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;}'

答案2

我为此编写了一个 shell 脚本。它可以处理文件名中包含空格或任何其他特殊字符的情况。

/bin/bash #!/bin/bash

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

笔记:这可以通过解析的输出来完成ls,但是给出了不应该这样做的原因这里

答案3

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

ls -l像平常一样在终端中运行命令并复制您想要粘贴到电子表格中的内容。

终端命令

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

文本导入向导将会弹出。请确保勾选旁边的复选框Space,然后按Ok。您可以在下方窗格中查看预览。

荔波文本导入

答案4

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 )

相关内容