![Git Bash에서 파일 이름의 공백을 처리하는 방법](https://rvso.com/image/1558675/Git%20Bash%EC%97%90%EC%84%9C%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%98%20%EA%B3%B5%EB%B0%B1%EC%9D%84%20%EC%B2%98%EB%A6%AC%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
Windows 7의 Git Bash에서 실행되도록 다음 스크립트를 작성했습니다.
#!/usr/bin/env sh
for logfile in `find -name "*.log" -o -name "*.err" -o -name "*.out"`
do
echo $logfile
grep "api/" "$logfile"
done
문제는 파일 이름에 공백이 있으면 grep이 작동하지 않는다는 것입니다. 나는 큰따옴표가 그것을 처리해야 한다고 생각했지만, 그것은 협력하지 않습니다.
아이디어?
답변1
솔루션 1
find
가장 가까운 해결책은 다음 과 함께 사용 -print0
하고 출력을 읽는 것 입니다 while read …
.
find -name "*.log" -o -name "*.err" -o -name "*.out" -type f -print0 | while IFS= read -r -d '' logfile; do
...
"$logfile"
변수를 사용할 때 항상 그렇듯 따옴표를 사용하여 계속 사용하세요 .
솔루션 2
또 다른 해결책은 find
전혀 사용하지 않고 grep
여러 파일에서 실행되도록 하는 것입니다.
shopt -s nullglob
shopt -s globstar
grep "api/" **/*.log **/*.err **/*.out
여기서는 globstar
와 디렉터리의 재귀적 일치를 활성화합니다 **
. nullglob
이러한 파일 확장자 중 하나가 존재하지 않는 경우 오류를 방지하도록 설정해야 합니다 .
명령줄 인수의 최대 길이에 도달할 수 있으므로 이는 제한된 파일 세트에만 적용됩니다.
왜 오류가 발생합니까?
(or 또는 공백이 포함된 파일 이름을 출력하는 다른 함수) for
의 출력에서 실행하면 안 됩니다 . 읽다find
ls
이 기사이것이 문제인 이유와 이를 해결하기 위해 수행할 수 있는 작업에 대한 자세한 내용을 알아보십시오.
즉, Bash는 공백으로 인수를 분할합니다. a
, foo bar
및 3개의 파일이 있다고 가정하면 b
해당 행은 다음과 같이 평가됩니다.
for logfile in a foo bar b; do
분명히 Bash는 , , 및 logfile
으로 설정될 것입니다 . 이는 원하는 것이 아닙니다. 에 대한 입력을 수동으로 지정할 수 있는 경우 이러한 파일 이름을 따옴표로 묶어 문제를 해결합니다.a
foo
bar
b
for
NUL
이 작업을 자동으로 수행하려면 이러한 파일 이름을 문자(옵션의 기능 -print0
)로 구분한 다음 해당 문자를 기준으로 출력을 다시 분할하는 것 ( in의 NUL
기능 ) 이 해결됩니다 .-d ''
read