Bash에서 ls 사용하기

Bash에서 ls 사용하기

다음과 같은 파일이 있습니다.

a.10 a.15 a.20 a.30 a.40 a.50

모든 사람에게 동일한 작업을 수행하려면 다음을 사용할 수 있습니다.

for data in `ls a*| sort -n`

같은 일을 하나씩 하고 싶다면. 사용할 수 있는 것:

data=(`ls a* | awk '{print $1}'`)
numb=`ls a*|wc|awk '{print $1}'`
ii=0
for da in ${data[$ii]} ; do
 echo  ${data[$ii]}
 ii=$(($ii+1))
 done

하지만 ii가 2보다 크거나 같은 파일에 대해 어떻게 동일한 작업을 수행할 수 있습니까? 즉, ls와 같지만 모든 파일이 2인 것은 아닙니다.

    a.20 a.30 a.40 a.50

답변1

ls확장이 실제로 쉘에 의해 수행될 때 출력을 구문 분석할 이유가 전혀 없습니다. 이 코드 대신:

for data in `ls a*| sort -n`

다음을 사용할 수 있습니다.

for data in a*

정렬해야 하는 경우에도 다음을 사용할 수 있습니다(파일 이름에 새 줄이 있으면 실패함).

for data in $( echo a* | sort -n )

여러 값을 사용하는 가장 좋은 방법은 해당 값을 배열에 넣는 것입니다.
구체적으로 매개변수 배열은 다음과 같습니다.

set -- a*
printf '<%s>' "$@"; echo

그리고 일부 작업을 하나씩 수행하는 코드는 다음과 같이 간단해집니다.

#!/bin/bash
set -- a*
numb=$#
printf '%s ' "$@"

파일 수를 기준으로 처리하려면 다음을 수행할 수 있습니다.

#!/bin/bash
# using bash as the [[ is more robust.

set -- a*         # set an array of all files that start by a
for    file       # walk the array one by one
do
       [[ ${file#a\.} -le 20 ]] && continue # is the file number < 20
       printf '%s\n' "$file"                # do additional processing here
done

답변2

다음은 요청된 패턴과 일치하는 모든 파일을 처리합니다. 그러나 a.2y숫자 접미사뿐만 아니라 기존 파일과 도 일치합니다 .

for file in a.2?; do
   #stuff with ${file}
done

숫자 접미사가 있는 파일만 처리하려는 경우 다음 방법을 사용할 수 있습니다.

for file in a.2{0..9}; do
    if [[ -f ${file} ]]; then # file exists
        # stuff with ${file}
    fi
done

관련 정보