다음과 같은 파일이 있습니다.
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