ls -l을 공백 대신 탭으로 필드를 분리하여 스프레드 시트에서 출력을 유용하게 만들 수 있습니까?


10

ls -l공백 대신 탭을 사용하여 필드를 분리하도록 출력을 어떻게 수정할 수 있습니까? 출력을 스프레드 시트에 붙여넣고 싶습니다. 가변 개수의 공백이있는 패딩은 그렇게하기가 어렵습니다. 설명하기 위해 :

drwxr-xr-x 2 루트 루트 4096 9 월 26 일 11:43 wpa_supplicant
-rw-r ----- 1 루트 전화 걸기 66 9 월 26 일 11:43 wvdial.conf
drwxr-xr-x 9 루트 루트 4096 10 월 8 일 08:21 X11
drwxr-xr-x 12 루트 루트 4096 2 월 18 일 23:31 xdg
drwxr-xr-x 2 루트 루트 4096 1 월 31 일 06:11 xml
drwxr-xr-x 2 루트 루트 4096 11 월 22 일 07:26 xul-ext
-rw-r--r-- 1 루트 루트 349 2012 년 1 월 13 일 zsh_command_not_found

위의 발췌에서 ls -l /etc1, 2 및 3 행은 2 열의 단일 자릿수를 갖는 반면 4 행은 2를 갖습니다. 즉, 1-3 행에서 1 열과 2 열을 분리하기 위해 2 개의 공백을 사용하고 4 열에서는 1 개의 공백 만 사용하여 정렬을 수행합니다.

ls 

답변:


3

같은 것을 위해 쉘 스크립트를 만들었습니다. 파일 이름에 공백이나 다른 특수 문자가있는 경우를 처리합니다.

#! / bin / bash

SAVEIFS = $ IFS
IFS = $ (에코 -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탭을 ?문자로 바꿉니다 . 스크립트는 탭 문자를 유지하여 출력이 탭으로 해석되고 스프레드 시트를 작성하는 데 사용되는 경우 추가 열을 작성합니다. 파일 이름에 줄 바꿈이 있으면 심하게 저하됩니다.
Eliah Kagan

1
진실. 그러나 일반적으로 파일 이름 이 \n없거나 \t이름이 다릅니다. 그렇다면 ls간단한 bash 명령으로 출력을 구문 분석하는 것이 더 복잡하지만 달성 할 수 있습니다. OP가 그러한 경우를 처리하려는 경우 답변을 업데이트 할 수 있습니다.
녹색

이것은 저에게 효과적이며 공백이있는 긴 파일 이름은 올바르게 표시됩니다. 내 사용법은 매우 간단하고 내가 가진 파일하지 거래를 희망 \n하고 \t이름이다.

1
완전한. Windows 스프레드 시트의 경우을 사용 printf "%s\t%s\t%s\t%s\r\n" $mod_month $mod_day $mod_time $file하여 출력 파일을로 리디렉션하십시오 ./ls_tab.sh > listing.txt.
Fedir RYKHTIK

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

1
철학

@ psny18 업데이트 된 방식이 훨씬 나빠졌습니다. 그것은 모든 있지만 각 파일 이름의 첫 번째 단어 차단. 단순히 글을 쓰는 $9것이 awk항상 공백을 열 사이의 구분을 나타내는 것으로 해석 한다는 사실을 바꾸지는 않습니다 . $9해당 위치의 첫 번째 단어 만 캡처하고 다른 단어는 별도의 높은 번호의 열로 간주되므로 전혀 인쇄되지 않습니다.
Eliah Kagan

파일 이름에 공백이 있어도 파일 이름이 하나의 열로 취급되지 않는 것이 유감입니다.

1

출력을 탭 구분으로 변환 할 필요조차 없습니다. 열 사이의 공간은 충분합니다.

ls -l평상시처럼 터미널에서 명령을 실행 하고 스프레드 시트에 붙여 넣을 내용을 복사하십시오.

터미널 명령

그런 다음 스프레드 시트 프로그램 (필자의 경우에는 LibreOffice Calc)을 열고 Ctrl+ V를 눌러 클립 보드의 내용을 붙여 넣습니다.

텍스트 가져 오기 마법사가 나타납니다. 옆에 확인 표시를하고을 Space누릅니다 Ok. 아래쪽 창에서 미리보기를 볼 수 있습니다.

Libo 텍스트 가져 오기


1
파일 이름에 공백이 있으면 작동하지 않습니다.
녹색

@ green7 : 아 .. 몰랐어! :-)
Aditya

파일 이름뿐만 아니라 열의 문자 수입니다. "공백"을 분리 문자로 선택하면 패딩이 발생합니다. 이를 설명하기 위해 질문을 편집하겠습니다.

0

파이썬은 이것에 좋습니다 :

# 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.