Can ls -l be made to separate fields with tabs rather than spaces to make the output useful in a spreadsheet?

How can the output of ls -l be modified to separate fields using tabs instead of spaces? I want to paste the output into a spreadsheet; the padding with a variable number of spaces makes it difficult to do so. To illustrate:

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

In the excerpt from ls -l /etc shown above, rows 1, 2 and 3 have a single digit in column 2 whereas row 4 has two. That means the alignment is achieved by using two spaces for separating columns 1 and 2 in rows 1-3, but just one space in row 4.


Try:

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

Or, if your filenames have spaces:

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

I've made a shell script for the same. It takes care of the cases when the filenames have spaces or any other special characters.

#! /bin/bash

SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for file in $(ls)
do
    stat --printf="%A\t%h\t%U\t%G\t%s\t" $file
    mod_epoch=$(stat --format="%Y" $file)
    mod_month=$(date -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
done
IFS=$SAVEIFS
  • Save it to a file, say ls_tab.sh
  • Make it executable:
chmod +x ls_tab.sh
  • Run it:
./ls_tab.sh

Note: This can be done by parsing the output of ls, however the reason why it should not be done is given here.


We do not even need to convert the output as Tab Delimited. Space between columns is just fine enough.

Run your ls -l command in terminal as you normally do and copy the contents you wish to be pasted in a Spreadsheet.

terminal command

Next, open your Spreadsheet program (LibreOffice Calc in my case) and press Ctrl + V to paste the contents of your clipboard.

The Text Import Wizard would pop up. Make sure you put a checkmark beside Space and press Ok. You can watch the preview in the lower pane.

Libo Text Import