저는 초보이고 스스로 해결할 수 없는 작은 문제가 있습니다. 이것이 내가 직면한 문제입니다:
이름에 공백이 있는 파일을 찾으려고 합니다.
이 부분은 작동 중입니다.
find $(pwd) -type d |grep " "
그런 다음
awk
전체 파일 이름을 인쇄하고 원하는 그룹 이름을 사용하는 "수동 입력"을 사용하여 변경했습니다.find $(pwd) |grep " " |awk '{print "changegrp developers \""$0"\""}'
developers
그룹 이름을 변수로 설정하려고 하면 실제로 예상대로 작동하지 않습니다.find $(pwd) |grep " " |awk group="developers" '{print "changegrp group \""$0"\""}'
정말 구문을 이해하지 못합니다. 수동으로 입력한 그룹은 어떻게 작동합니까? 변수로 만들면 작동합니다. 나는 이런 종류의 일이 작은 따옴표나 큰 따옴표 등을 잊어버려서 문제를 일으킬 수 있다는 것을 알고 있습니다.
내가 뭘 잘못하고 있는지 지적해 주실 수 있나요?
답변1
group
awk에 필요한 변수를 전달 하고 awk가 이를 (문자열 리터럴이 아닌) 변수로 처리하도록 하려면 -v group="developers"
큰따옴표 밖에 있어야 합니다.
awk -v group="developers" '{print "changegrp " group " \""$0"\""}'
그러나 다음과 같은 것을 사용하면 많은 두통을 피할 수 있습니다.
find . -type d -name '* *' -exec changegrp developers {} \;
또는 ( changegroup
여러 파일 매개변수가 지원되는 경우 - 특정 명령에 익숙하지 않습니다.)
find . -type d -name '* *' -exec changegrp developers {} +
당신은 또한 볼 수 있습니다
답변2
find
및 를 피하고 awk
디렉터리에만 관심이 있다고 가정합니다(첫 번째 코드 조각을 기준으로).
shopt -s globstar dotglob nullglob
for name in ./**/*' '*; do
[[ -d $name ]] && [[ ! -L $name ]] && changegrp developers "$name"
done
또는,
shopt -s globstar dotglob nullglob
for name in ./**/*' '*/; do
[[ ! -L ${name%/} ]] && changegrp developers "$name"
done
changegrp
이는 간단한 루프를 사용하여 이름에 공백이 하나 이상 있는 모든 디렉터리에서 명령을 실행합니다. 하위 디렉터리의 **
와일드카드 패턴을 일치시켜 globstar
이를 수행합니다 ( 의 셸 옵션을 통해 활성화됨). 쉘 bash
옵션은 쉘이 일치하지 않는 패턴을 제거하고 숨겨진 이름과 일치하도록 하는 데 사용됩니다.nullglob
dotglob
-L
여기에서는 디렉토리에 대한 심볼릭 링크를 지우는 테스트가 사용됩니다 ( -d
테스트는 다음과 같습니다).진짜디렉토리 및 디렉토리에 대한 심볼릭 링크의 경우).
위 코드의 두 번째 변형에서는 /
패턴 끝에 a를 추가하여 디렉터리만 선택합니다. 테스트할 때 이 슬래시를 제거해야 합니다 -L
. 이것이 ${name%/}
수행되는 작업입니다.
developers
그러면 문자열을 변수로 만드는 것이 쉽습니다 .
shopt -s globstar dotglob nullglob
group=developers
for name in ./**/*' '*; do
changegrp "$group" "$name"
done
(이 코드는 다음에도 작동합니다 changegrp
.모두질문의 다른 코드 조각을 기반으로 현재 디렉토리 내부 또는 아래에 공백이 포함된 이름입니다. )