2012-10-19 2 views
2

input1부터 input2까지 (인수, 사용자 입력)까지 디렉토리의 폴더와 파일의 이름을 나열해야합니다.주어진 인수로 디렉토리 이름 나열하기

#!/bin/bash 
START_INDEX=$1 
END_INDEX=$2 
    for $STA_INDEX in $(ls) -le $END_INDEX; do 
      echo item: $STA_INDEX 
    done 

제 동료와 함께 우리는 해결책이 전혀없는 "해결책"을 생각해 냈습니다. 그럼 누구나 내가 잘못 알고있는 부분을 설명하거나 해결 방법에 대한 다른 접근법을 제시 할 수 있습니까? 나는이 코드 조각이 당신에게 주요 아이디어를 줄 것이라고 생각한다. 이 작품은 어떻게

ls | sed -ne "${START_INDEX},${STOP_INDEX}p" 

: 당신이 얘기 인덱스는/말을 시작하려는 ls 출력 인덱스가있는 경우

+0

당신이 '입력 2까지 입력 1부터 시작'무엇을 의미합니까? 파일/폴더의 순서는 무엇입니까? –

+0

여기서 무엇을 하려는지 확실하지 않습니다. '-le'을 사용했다면 2 개의 입력이 숫자라고 가정합니다. 그리고 m 번째 결과를'ls'의 n 번째 결과에 나열하고 싶습니까? – doubleDown

+0

@doubleDown 예, 입력은 숫자입니다. 예를 들어 내 홈 디렉토리에 MyDocs로 시작하고 MyVideos를 2nd로, MyMusic을 8로 시작하는 폴더가 있습니다. 내가하고 싶은 일은 다음과 같습니다. 첫 번째 입력으로 2 초에 7 초 걸릴 것입니다. 이제 폴더 이름을 순서대로 인쇄하고 싶습니다. – October

답변

0

은, 그것은 sed으로 해결하기 쉬운 뭔가 그 다음 sed과에서 자동 출력을 억제 범위 <$START_INDEX,$STOP_INDEX>에있는 모든 행을 인쇄합니다. 자세한 내용은 sed 매뉴얼을 참조하십시오. 범위 운영자를 검색하십시오.

+1

안전을 위해 변수 이름을 중괄호로 묶어야합니다. 예 :'$ {START_INDEX}, $ {STOP_INDEX} ' – doubleDown

+0

"catch"때문에 "p"sed 명령이 필요합니다. 답변을 수정했습니다. – anydot

1

사용자가 두 개의 이름을 지정 것으로 예상된다고 가정하면 일종의 두 이름 사이에,이 스크립트는 작업을 수행 할 파일을 나열 할 :

#!/bin/bash 

case $# in 
(2) : OK;; 
(*) echo "Usage: $0 from to" >&2; exit 1;; 
esac 

lo="$1" 
hi="$2" 
for file in * 
do [[ "$file" < "$lo" ]] && continue 
    [[ "$file" > "$hi" ]] && break 
    echo "$file" 
done 

case 수표 사용은 두 가지를 한 것으로를 논쟁하고 그들이 도움이되지 않는다면 도움이되는 메시지로 보석을 풀 수 있습니다. 간단히 가정하면 $lo$hi보다 낮습니다. 하지 않을 경우이를 교환 할 수있을 것입니다 :

if [[ "$1" < "$2" ]] 
then lo="$1"; hi="$2" 
else lo="$2"; hi="$1" 
fi 

* (글로브)를 사용하여 파일 이름에 공백 (등) 문제를 방지 할 수 있습니다. ls의 출력을 구문 분석하면 파일 이름에 공백 (등)이 있기 때문에 오류가 발생하기 쉽습니다. 테스트에서는 [[을 사용하므로 문자열의 사전 식 순서를 지정할 수 있습니다. 클래식 [ 테스트 연산자는 -lt 표기법을 사용하여 정수 비교를 수행하며 문자열 비교를 위해 =!= 만 지원합니다.

glob의 이름은 정렬 된 순서이므로 첫 번째 조건은 $lo 항목 앞에 오는 이름을 건너 뜁니다. $hi이 너무 작 으면 다른 파일을 처리 할 필요가 없습니다 (따라서 중단). 그렇지 않으면 이름을 인쇄합니다.

루프는 매우 컴팩트하게 작성됩니다. if, elifelse으로 약간 작아 질 수 있습니다. 디렉토리 목록을 감안할 때

for file in * 
do 
    if [[ "$file" < "$lo" ]] 
    then continue 
    elif [[ "$file" > "$hi" ]] 
    then break 
    else echo "$file" 
    fi 
done 

:

cmp.sh  human_numbers.pl intapprox.pl lg.c lu makefile x 
fibonacci.pl idsdb00216213.ec lg   lg.out lu.c unget.c x.c 

bash cmp.sh garbage rubbish 실행은 생산 :

내가 기대하는 것을 동의
human_numbers.pl 
idsdb00216213.ec 
intapprox.pl 
lg 
lg.c 
lg.out 
lu 
lu.c 
makefile 

는 약간 loosely- 당신의 나의 해석을 부여 말로 된 질문. garbagerubbish도 디렉토리의 파일 이름이 아니지만 여전히 작동합니다.이 같은 (기본)

+0

doch [[ "$ file"> "$ hi"]] && break [[ "$ file]에있는 파일에는'> = '연산자가 없지만'<'및'||': 의 파일에는 을 사용할 수 있습니다. "<"$ lo "]] || echo "$ file" done – Neil

+0

바, 코멘트를 포맷 할 수 없습니다. 그래도 아이디어를 얻길 바랍니다. – Neil

+0

흥미로운 사실은 흥미 롭습니다 ('[''에'<=' or '> ='연산자가 없으므로 표시되는 코드가 심각한 디자인보다 행운에 의해 더 중요하므로 그리 중요하지 않습니다. 그것은 발생하지만 그럼에도 불구하고 사용하지는 않습니다). –

0

뭔가 :

#! /bin/bash 

for x in $* 
do 
    ls -l $x 
done 


$./args.sh dir1 dir2 ... 
관련 문제