2017-12-01 3 views
0

이것은 간단한 형식의 질문이지만 대답은 나를 벗어납니다.'ls -lrt'의 형식을 지정하고 bash의 텍스트 파일로 보내는 방법

와일드 카드가있는 특정 파일을 찾고 파일로 인쇄하고 전자 메일을 보낼 수있는 bash 스크립트가 있습니다. ls -lrt $var*이 필요하지만 출력물을 화면에 보이는 것처럼 한 줄씩 깔끔하게 인쇄 할 수는 없습니다.

-rw-rw-r-- 1 user user 14173 Nov 30 06:39 20171129_file1.txt.gz<br> 
-rw-rw-r-- 1 user user 30954 Nov 30 06:39 20171129_file2.txt.gz<br> 
-rw-rw-r-- 1 user user 95933 Nov 30 07:01 20171129_file3.txt.gz<br> 
-rw-rw-r-- 1 user user 399507 Nov 30 08:43 20171129_file4.txt.gz<br> 

내가이 시도 : I 출력 파일이 찾고 있어요

for f in `ls -ltr $var*`; do 
    echo $f >> /tmp/mailtext 
done 

을하지만 파일 출력은 모든 필드에 대한 새로운 라인이있다 : 다음

-rw-rw-r-- 
1 
user 
user 
133119 
Dec 
1 
07:06 
20171130_filename.txt.gz 
etc...... 

과 나는 echo와 같은 새로운 라인을 보내지 않는 printf와 함께 이것을 시도했지만, 네 개의 파일은 모두 엉망이다. 모두 한 줄에 출력을 생성

for f in `ls -ltr $var*`; do 
    printf "x $f" >> /tmp/mailtext 
done 

:

x -rw-rw-r--x 1x userx userx 13318x Decx 1x 07:06x 20171130_filename1.txt.gzx -rw-rw-r--x 1x userx userx 30793x Decx 1x 07:06x 20171130_filename2.txt.gzx -rw-rw-r--x 1x userx userx 99811x Decx 1x 08:00x 20171130_filename3.txt.gzx -rw-rw-r--x 1x userx userx 41363x Decx 1x 08:10x 20171130_filename4.txt.gz 

은 물론 나는 printf와 "X의 $ f를 \ n"을 시도했지만 그때는 첫 번째 시도에서 하나처럼 보였다.

그래서 어떤 아이디어를 어떻게 간단한 형식으로 할 수 있습니까? 고맙습니다! 일을

+3

왜'ls -ltr $ var *>/tmpmailtext'가 아닌가? 행운을 빕니다. – shellter

+0

[ls'의 출력을 분석하지 마십시오.] (http://mywiki.wooledge.org/ParsingLs), [for 명령 루프를 반복하기 위해'for' 루프를 사용하지 마십시오] (http : /mywiki.wooledge.org/BashFAQ/001). – chepner

+0

질문에 서식을 사용하십시오. – PesaThe

답변

1

당신이 그 2 개 테스트를 깨달았 :

for i in `some command` ; do 
    ... 
done 

어떤 명령의 출력을 구문 분석 할 수 있습니다 단어 갈라 $ IFS에 따라 다음 내가, 하나 하나 그 각각의 값을합니다. 귀하의 경우에는 공백으로 분리되어 각 단어가 하나씩 읽혀집니다. 나는 "$ var에"따옴표를 추가

ls -lrt "$var"* > somefile 

공지 사항 (거의 모든 경우에 좋은 방법입니다) : 당신이 필요로하는 무엇

은 수행 파일에 명령의 출력을 리디렉션하는 것입니다 그리고 쉘이 여전히 globbing 요청으로 해석하도록 그 큰 따옴표 바깥에 *을 남겨 둡니다.

당신이 (그 사이에 약간의 일시 정지로) 라인으로 결과 라인을 인쇄하는 대신 원하는 경우, 다음을 수행 할 수 있습니다

for file in "$var"* ; do 
    ls -lrt "$file" # mandatory double-quotes 
    sleep 1   # will sleep 1 second before looping 
done | tee somefile # shows both on your screen AND sends to "somefile" 

또는 변화를 포함한다.

나는 LS의 출력을 구문 분석하지 않는 것을 여기

공지 사항 (exemple에 대한 값 : 깨진 방법 : ls -lrt "$var"* | whil IFS= read -r line; do ... ; done : 어떤 파일 이름이 개행 문자가 포함되어있는 경우 잘 작동하고, 다른 나쁜 부작용뿐만 아니라 거기되지 않습니다) .

대신 올바른 방법을 직접 사용합니다. for 루프는 쉘을 관련 파일 이름을 $file var에 하나씩 넣습니다.

참조 : 좋은 설명은 http://mywiki.wooledge.org/BashPitfalls (항목 1)을 참조하십시오.

+0

아, 그렇습니다. 그렇습니다. 나는 이것을 지나치게 복잡하게 만들었습니다! 내 방어에 , 난 그냥 다른 사람의 스크립트를 고정 선수로 에코'1! -lrt $ var에의 *'>> 파일을했고, 그것은 모든 뒤죽박죽이었다. 그래서 나는 그것을 unjumble하려고했습니다. 어쨌든 문제가 해결되었습니다. 나는 간단한 대답이 있다는 것을 알았다! :/ –

+0

@ChuckPedro : 시도하는 데 부끄러운 점이 없습니다. 그런 식으로 배우십시오 :) 모든 BashPitfalls와 BashGuide 및 BashFaq 항목을 같은 사이트에서 찾아 볼 것을 적극 권장합니다. 쉘 프로그래밍에 오신 것을 환영합니다. (특히 여기에 대해서.) unix.stackexchange.com은 쉘 특유의 괴상함을위한 좋은 장소입니다. 특히 유닉스 밑에있는 것들 (파일 이름 등)과 관련이 있다면 요. –

관련 문제