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 2月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ルートルート349 2012年1月13日zsh_command_not_found

ls -l /etc上記の抜粋では、行1、2、3は列2に1桁あり、行4は2桁です。つまり、行1〜3の列1と2を分離するために2つのスペースを使用して、行4には1つのスペースのみを使用して位置合わせが行われます。

ls 

回答:


3

同じためのシェルスクリプトを作成しました。ファイル名にスペースやその他の特殊文字が含まれている場合にも対応します。

#!/ 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 = $(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
終わった
IFS = $ SAVEIFS
  • ファイルに保存します。 ls_tab.sh
  • 実行可能にします。
chmod + x ls_tab.sh
  • それを実行します:
./ls_tab.sh

注:これはの出力を解析することで実行できますが、実行しlsてはならない理由はここに記載されています


1
目標が何をls言っているを知ることである場合、その出力の解析は問題ありません。それはめったに目標ではありません。間違いなくここです。あなたが使用した方法は非常に良いと思います(どの方法でも、いくつかのニーズがある場合、望ましくない結果が生成されます)。ただし、間違いなく構文解析のls方が優れている可能性があります。実際にタブ文字が含まれているファイル名の場合を考えてみましょう。ls -lタブを?文字に置き換えます。スクリプトはタブ文字を保持します。その出力がタブ区切りとして解釈され、スプレッドシートの作成に使用される場合、追加の列が作成されます。ファイル名に改行があると、パフォーマンスが著しく低下します。
Eliah Kagan 2013

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、およびを使用して、ファイルをとして出力します./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 2013年

残念ながら、これはスペースを含むファイル名に対しては正しく機能しません。それらをタブに置き換えます。これは、green7のスクリプトベースのソリューションよりも単純で高速に実行されますが、大量の時間で誤った出力が生成され、Adityaの方法に勝る利点はありません。これを変更して、9列目以降のスペースが入力デリミタとして解釈されないようにすることはできますか?
Eliah Kagan 2013

1
更新をご覧ください
philshem 2013年

@ psny18更新された方法はさらにひどく壊れています。これは、すべてのものが、各ファイル名の最初の単語を遮断します。単に書くだけで$9は、awk常にスペースを列間の区切りを示すものとして解釈するという事実は変わりません。$9はその位置の最初の単語のみをキャプチャし、他の単語は個別の番号の大きい列と見なされるため、まったく出力されません。
Eliah Kagan 2013

ファイル名にスペースが含まれていても、ファイル名が1つの列として扱われないのは残念です。

1

出力をタブ区切りとして変換する必要さえありません。列間のスペースは十分に細かいです。

ls -l通常どおりターミナルでコマンドを実行し、スプレッドシートに貼り付けたい内容をコピーします。

端末コマンド

次に、スプ​​レッドシートプログラム(私の場合はLibreOffice Calc)を開き、Ctrl+ Vを押してクリップボードの内容を貼り付けます。

テキストインポートウィザードがポップアップします。横にチェックマークを付けて、Spaceを押してくださいOk。下のペインでプレビューを見ることができます。

Liboテキストインポート


1
これは、ファイル名にスペースが含まれている場合は機能しません
緑の

@ green7:ああ..気づかなかった!:-)
Aditya

ファイル名だけでなく、列の文字数も。区切り文字として「スペース」が選択されている場合、そこや他の場所でパディングを行うと問題が発生します。それを説明するために質問を編集します。

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 )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.