각 파일 세트가 전역 패턴과 일치하는 여러 파일 세트 각각에 대해 동일한 집계 작업을 수행하고 싶습니다. 내가 원하지 않는 것은 각 파일 이름을 개별적으로 집계 함수로 파이프하는 것입니다.
첫 번째 시도는 실패했습니다. 외부 루프에서 파일 이름이 와일드카드로 지정되어 전체 컬렉션을 별도의 배치로 처리하는 대신 단순 목록으로 병합했기 때문입니다.
for fileglob in /path/to/bunch*1 /path/to/bunch*2 ... ; do
stat "$fileglob" | awk [aggregation]
done
따라서 *
루프를 이스케이프하여 숨긴 다음 함수를 이스케이프 해제합니다.
for fileglob in /path/to/bunch*1 /path/to/bunch*2 ... ; do
realglob=`echo "$fileglob" | sed 's/\\//g'`
stat "$realglob" | awk [aggregation]
done
더 좋은 방법이 있어야 합니다. 그것은 무엇입니까?
GNU 배쉬, 버전 3.2.51
답변1
이를 위해서는 따옴표를 주의 깊게 사용해야 합니다.
for fileglob in '/path/to/bunch*1' '/path/to/bunch*2' ... ; do
stat $fileglob | awk [aggregation]
done
그러나 공백(또는 개행)이 포함된 파일 이름의 경우 실패할 수 있습니다. 이것을 사용하는 것이 더 좋습니다:
fileglobs=("/path/to/bunch*1" "/path/to/bunch*2")
for aglob in "${fileglobs[@]}" ; do
set -- $aglob
stat "$@" | awk [aggregation]
done
glob이 올바르게 확장되어 위치 인수에 배치되었습니다.
set -- $aglob
그런 다음 각 매개변수는 다음 위치에 매개변수로 배치됩니다 stat
.
stat "$@"
그리고 출력은 stat
(출력으로) awk
.
답변2
외부 루프에서 전역 패턴을 해석하지 않으려면 작은따옴표로 전역 패턴을 묶습니다.
for fileglob in '/path/to/bunch*1' '/path/to/bunch*2' ; do
stat "$fileglob" | awk [aggregation]
done
나는 당신이 무엇을 성취하려고 하는지 모르기 때문에 이것을 테스트하지는 않았지만 비슷한 테스트를 실행했습니다.
인용없이
for a in a* b*; do
echo $a
done
산출
$ ./test.sh
abc
ade
atlmfc.zip
bce
bin
따옴표 포함
for a in 'a*' 'b*'; do
echo $a
done
산출
$ ./test.sh
abc ade atlmfc.zip
bce bin
기본적으로 glob은 루프 대신 에코로 해석됩니다. 따라서 각 글로브마다 하나씩 두 줄의 출력이 있습니다.