grep을 사용하여 특정 확장자와 특정 디렉터리에 있는 파일을 필터링하는 bash 스크립트가 있습니다. 스크립트는 다음과 같습니다.
generate_exclud_extensions() {
echo "\"(cpp$"
}
generate_exclude_dirs() {
echo "|^test)\""
}
command=$(generate_exclud_extensions)$(generate_exclude_dir)
echo $command
git ls-files | grep -vE $command
스크립트는 cpp
확장명이 있는 파일과 test
디렉터리 아래의 파일을 필터링해야 합니다. 그러나 결과는 첫 번째 항목만 필터링하고 두 번째 항목은 남겨 두었습니다.
사실 1: echo $command
출력 "(cpp$|^test)"
하고 터미널에서 전체 명령을 실행하면 git ls-files | grep -vE ""(cpp$|^test)""
올바른 결과를 얻었습니다.
사실 2: grep을 다음과 같이 두 번 시도했습니다.
git ls-files | grep -vE "cpp$" | grep -vE "^test"
Bash 스크립트에서도 동일한 오류가 발생하지만 터미널에서는 수정되었습니다.
찾고 있었지만 아직 운이 없었습니다. 누구든지 이것에 대해 밝힐 수 있다면 감사하겠습니다.
답변1
문제를 재현할 수 있었습니다. 이는 두 가지 기능의 bash 이스케이프 문제입니다. 이 시도:
generate_exclude_extensions() {
echo '(cpp$'
}
generate_exclude_dirs() {
echo '|^test)'
}
command=$(generate_exclude_extensions)$(generate_exclude_dirs)
echo "$command"
git ls-files | grep -vEe "$command"
재현하고 싶은 코드
generate_exclude_extensions() {
echo '(cpp$'
}
generate_exclude_dirs() {
echo '|^test)'
}
command=$(generate_exclude_extensions)$(generate_exclude_dirs)
echo "$command"
echo -e 'cpp\n
test\n
test456\n
display?5\n' | grep -vEe "$command"
스크립트에 오타가 두 개 더 있습니다
generate_exclude_dir -> generate_exclude_dirs
generate_exclud_extensions -> generate_exclude_extensions
:) 재미있게 보내세요
답변2
또 다른 접근 방식은 다음과 같습니다.
generate_exclude_extensions() {
echo 'cpp$'
}
generate_exclude_dirs() {
echo '^test'
}
exclusions=$(
generate_exclude_extensions
generate_exclude_dir
)
printf '%s\n' "$exclusions"
git ls-files | grep -ve "$exclusions"
즉, 한 줄에 하나의 제외 항목이 있으면 -E
.
답변3
힘내를 사용할 수 있습니다exclude
경로 지정필터 출력:
exclude_extensions=( '*cpp' '*.txt' ) # added `*.txt` as sample file extension
exclude_dirs=( 'test/*' ) # exclude files in relative directory `test`
git ls-files "${exclude_extensions[@]/#/:(exclude)}" "${exclude_dirs[@]/#/:(exclude)}"
매개변수 확장은 "${exclude_...[@]/#/:(exclude)}"
접두사가 붙은 공백으로 구분된 항목 배열과 그 뒤에 :(
경로 지정 "magic word" 가 오는 배열 로 확장됩니다 .exclude
)
결과 명령은 다음과 같습니다.
git ls-files ':(exclude)*cpp' ':(exclude)*.txt' ':(exclude)test/*'