비슷한 이름을 가진 여러 파일을 추가할 수 있는 Unix 스크립트를 찾고 있습니다.
예를 들어 서버에는 다음과 같은 파일이 있습니다.
output2019_1.txt
output2019_2.txt
output2019_3.txt
output2020_1.txt
echo "Hello" | mailx -a "test attachments" -a output2019* [email protected]
위 스크립트는 2019년 파일만 추가합니다. 2019년 파일 3개를 모두 이메일에 첨부하고 싶습니다.
이메일 본문의 과거 uuencode가 아닌 실제 첨부 파일을 찾고 있습니다.
답변1
다음과 같은 방법으로 버팀대 확장을 사용할 수 있습니다.
echo "Hello" | mailx -a "test attachments" '-aoutput2019_'{1..3}.txt [email protected]
답변2
당신은 사용할 수 printf
있습니다명령 대체:
echo Hello | mailx $(printf -- '-A %s ' output2019*) [email protected]
--
더 이상 옵션 인수가 없다고 printf에 알립니다 (그렇지 않으면 -A
유효하지 않은 옵션에 대해 불평합니다). 나머지 각 인수(일치하는 file )가 인쇄될 '-A %s '
형식 문자열 입니다 . output2019*.txt
예를 들어 mailx는 다음과 같이 실행됩니다.
mailx -A output2019_1.txt -A output2019_2.txt -A output2019_3.txt [email protected]
참고: 이는 모든 파일 이름에 대해 작동하지 않습니다. 공백이나 쉘 메타 문자가 포함된 파일 이름에는 실패합니다. 이러한 문제를 해결하려면 형식 문자열에 따옴표를 포함하면 됩니다. 예를 들어
echo Hello | mailx $(printf -- "-A '%s' " output2019*) [email protected]
이는 모든 문자가 포함된 파일 이름에 적용됩니다.와는 별개로아포스트로피.
다음을 포함하는 프로세스 파일 이름어느문자를 유효하게 하려면 먼저 -A 옵션과 파일 이름 쌍을 포함하는 배열을 만들어야 합니다. 예를 들어프로세스 교체존재하다 bash
:
mapfile -d '' -t attachments < \
<(find . -maxdepth 1 -name 'output2019*' -printf '-A\0%p\0')
echo Hello | mailx "${attachments[@]}" [email protected]
Bash가 이와 같은 배열을 확장하면(즉, 인덱스로 큰따옴표로 묶음 [@]
),배열의 각 요소는 별도의 "단어"로 처리됩니다., 추가 분사나 해석의 영향을 받지 않습니다.
이를 위해서는 옵션 find
으로 GNU(Linux의 표준) 가 필요합니다. 여기서는 각 파일 이름에 NUL을 출력하도록 -printf
지시한 다음 파일 이름 뒤에 또 다른 NUL이 옵니다.find
-A
이 mapfile
명령은 stdin에서 배열을 채우고 NUL이 구분 기호(with)임을 알려줍니다... 그리고 stdin은 -d ''
프로세스 대체( )를 통해 리디렉션됩니다 <
. 배쉬를 find ...
참조하세요 help mapfile
. 그건 그렇고, readarray
bash의 동의어입니다.mapfile
예제의 파일 이름을 사용하면 $attachments
배열이 6개 요소로 채워집니다.
$ declare -p attachments
declare -a attachments=([0]="-A" [1]="./output2019_1.txt" [2]="-A" [3]="./output2019_3.txt" [4]="-A" [5]="./output2019_2.txt")
IMO, 이것은 모든 파일 이름에서 작동하므로 최고의 버전입니다. 타이핑이 조금 힘들지만 그만한 가치가 있습니다. 항상 "무엇이 잘못될 수 있나요?"이 점을 염두에 두고 그런 일이 일어나지 않도록 하세요.