awk는 변수, 공백이 있는 파일을 전달합니다.

awk는 변수, 공백이 있는 파일을 전달합니다.

저는 초보이고 스스로 해결할 수 없는 작은 문제가 있습니다. 이것이 내가 직면한 문제입니다:

  • 이름에 공백이 있는 파일을 찾으려고 합니다.

    이 부분은 작동 중입니다.

      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

groupawk에 필요한 변수를 전달 하고 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옵션은 쉘이 일치하지 않는 패턴을 제거하고 숨겨진 이름과 일치하도록 하는 데 사용됩니다.nullglobdotglob

-L여기에서는 디렉토리에 대한 심볼릭 링크를 지우는 테스트가 사용됩니다 ( -d테스트는 다음과 같습니다).진짜디렉토리 및 디렉토리에 대한 심볼릭 링크의 경우).

위 코드의 두 번째 변형에서는 /패턴 끝에 a를 추가하여 디렉터리만 선택합니다. 테스트할 때 이 슬래시를 제거해야 합니다 -L. 이것이 ${name%/}수행되는 작업입니다.

developers그러면 문자열을 변수로 만드는 것이 쉽습니다 .

shopt -s globstar dotglob nullglob

group=developers

for name in ./**/*' '*; do
    changegrp "$group" "$name"
done

(이 코드는 다음에도 작동합니다 changegrp.모두질문의 다른 코드 조각을 기반으로 현재 디렉토리 내부 또는 아래에 공백이 포함된 이름입니다. )

관련 정보