내부 파일이 아닌 glob 패턴을 반복합니다.

내부 파일이 아닌 glob 패턴을 반복합니다.

각 파일 세트가 전역 패턴과 일치하는 여러 파일 세트 각각에 대해 동일한 집계 작업을 수행하고 싶습니다. 내가 원하지 않는 것은 각 파일 이름을 개별적으로 집계 함수로 파이프하는 것입니다.

첫 번째 시도는 실패했습니다. 외부 루프에서 파일 이름이 와일드카드로 지정되어 전체 컬렉션을 별도의 배치로 처리하는 대신 단순 목록으로 병합했기 때문입니다.

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은 루프 대신 에코로 해석됩니다. 따라서 각 글로브마다 하나씩 두 줄의 출력이 있습니다.

관련 정보