grep(또는 대안)을 사용하여 목록 반환 [닫기]

grep(또는 대안)을 사용하여 목록 반환 [닫기]

/usr/share/applications/*.desktop에서 "이름", "Exec" 및 "아이콘" 필드 목록을 반환하려고 합니다.

난 달린다:

  1. grep Icon= /usr/share/applications/*.desktop | cut -d '=' -f 2

    좋음: 목록이 주어졌습니다.

    오류: Icon= 필드가 없는 모든 .desktop 파일을 건너뛰는 중입니다.

    문제: "Icon=" 필드가 없는 모든 파일을 건너뛰는 대신 0을 반환하고 싶습니다. 어떻게 해야 하나요?

  2. grep Exec= /usr/share/applications/*.desktop | cut -d '=' -f 2

    좋음: 목록이 주어졌습니다.

    나쁜 점: i) 위에서 언급한 대로 Icon= 필드가 없는 모든 .desktop 파일을 건너뜁니다. ii) 이러한 필드에는 공백 뒤에 원하지 않는 문자(예: %u)가 포함되는 경우가 많습니다.

    질문: i) 위와 동일합니다. ii) 공백 뒤의 문자를 반환하지 않도록 명령에 ' ' 구분 기호도 포함하려면 어떻게 해야 합니까?

  3. grep Name= /usr/share/applications/*.desktop | cut -d '=' -f 2

    좋음: 목록이 주어졌습니다.

    오류: Name=의 텍스트뿐만 아니라 GenericName= 또는 anyotherName=의 텍스트도 반환됩니다.

    질문: "Name="만 반환되고 다른 필드는 반환되지 않도록 명령을 작성하려면 어떻게 해야 합니까?

편집: Mint Cinnamon 20.3을 사용하여 단일 명령/스크립트로 1,2,3을 동시에 수행하는 것이 가능합니까, 아니면 다른 질문의 기준에도 맞는 한 질문에 대한 해결책이 있습니까? 그냥 "아이콘"을 바꾸세요. "실행"과 "이름"만 바꾸시면 됩니다.

답변1

GNU awk에서는 다음과 같은 작업을 수행할 수 있습니다.

gawk -F'[[:blank:]]*=[[:blank:]]*' -v key=Exec '
  BEGINFILE {value = "0"} 
  $1 == key {value = $2; nextfile} 
  ENDFILE {split(value,v,/[[:blank:]]+/); print v[1]}
' /usr/share/applications/*.desktop

다른 상황에 따라 키를 변경하세요.

관련 정보