2012-03-08 2 views
2

나는 쉘 스크립트를 쓰고 있습니다.리눅스 셸 파일 이름을 얻으십시오

2012-03-08_16-37-41 
2012-03-08_16-37-43 
2012-03-08_16-37-46 
2012-03-08_16-37-55 

간단한 스크립트 :

#!/bin/bash 
FILENAME= ???? 
echo $FILENAME 

그리고 FILENAME 값이 2012-03-08_16-37-55 (정렬 된 파일 이름 목록의 마지막 요소)해야

나는 다음과 같은 파일이 있습니다. 또한 파일 이름의 시작은 2012이어야합니다.

이 문제를 어떻게 해결할 수 있습니까?

답변

5
FILENAME=$(ls -r 2012* | head -n 1) 
+0

내 생각보다 훨씬 좋다 :) +1 –

+0

2012-03-08_16-37-55가 폴더 일 때, 명령은 내부 파일의 값을 반환합니다. – Martynas

+0

sry. 작동하고있어. 끝에 ":"가 표시됩니다. 그것을 제거하는 방법? – Martynas

1

ls 명령을 사용하여 파일을 가져 오거나 "파일 묶기"를 사용하여 와일드 카드를 확장 할 수 있습니다.

#!/bin/sh 

for filename in 2012*; do 
    echo "File (by globbing) is $filename" 
done 

ls 2012* | while read filename; do 
    echo "File (via ls) is $filename" 
done 

마지막 하나를 얻으려면, 가장 쉬운 방법은 ls 출력을 정렬 할 수 있습니다 :

filename=`ls -r 2012* | head -1` 

그러나 할 수도 있습니다 만 꼬리 글로브, 당신은 지저분한되고 싶어합니다.

for filename in 2012*; do 
    echo "File (by globbing) is $filename" 
done | tail -1 
0
f=""; 
for f in 2012* ; 
do 
    # haha - don't do anything. 
    dummy=42 
done; 
echo "now do something with $f" 
2

하지 parse ls 출력 마십시오. 대신, 찾을 사용

#!/bin/sh 

find . -name 2012* | sort | tail -1 

을 변수에 결과를 할당하려면 :이 또한 제공

#!/bin/sh 

filename=$(find . -name 2012* | sort | tail -1) 

당신은 (하지)를 포함하여 many options find has의 모든 액세스 심볼릭 링크 다음, 재귀 만 반환 파일을 (디렉토리가 아님), 시간 소인 확인 등이 있습니다.

0

외부 명령을 사용하지 않고 : set 2012*; eval FILE=\$$#. 이것은 eval을 완벽하게 안전한 사용입니다.

관련 문제