feh에서 절대 경로 얻기

feh에서 절대 경로 얻기

이것ㅋㅋㅋ명령을 사용하면 폴더의 이미지를 반복적으로 볼 수 있습니다.

feh --recursive --auto-zoom

이미지를 볼 때 사용자 정의 명령을 키보드의 0-9 키와 연결할 수도 있습니다. 예를 들어, 터미널에서 내가 보고 있는 이미지의 파일 이름을 터미널에 출력하도록 하려면 이미지가 표시되는 동안 0 키를 누르고 feh다음과 같은 인수를 사용하여 실행 하면 됩니다 .--action

feh --recursive --auto-zoom --action "echo '%f'"

--action명령을 echo '%f'0 키에 바인딩합니다. %f출력 시 아래와 같이 상대 경로입니다 ./filename.jpg.

feh하지만 상대 경로 대신 절대 경로를 제공 해야 합니다 . 따라서 해당 지점을 잘라내고 나머지 내용을 pwd.

내 시도는 다음과 같습니다.

feh --recursive --auto-zoom --cache-size 2048 --action "echo $(pwd)$(echo '%f' | cut -c 2-)}"

그러나 출력은 다음과 같습니다.

/absolute/pathf

(pwd 끝에 있는 "f"에 유의하세요)

어떻게 그러한 결과를 얻을 수 있습니까? :

/absolute/path/filename.jpg

답변1

그냥 해:

feh --recursive --auto-zoom --action 'printf "%%s\n" %F' "$PWD"

그건:

  • 현재 작업 디렉토리의 전체 경로를 feh ( feh와 동일 하지 않음 .)에 전달하면 그 안에 있는 파일의 전체 경로가 제공됩니다.
  • 이렇게 적절하게 인용하는 %F대신 사용하십시오 ( 문자가 포함된 파일 이름이 질식하게 되어 임의의 명령 실행 취약점이 될 수도 있습니다(이름이 더 나쁘거나 이름이 더 나쁜 파일을 상상해 보십시오 )).%f'%f''';reboot #.jpg
  • 사용하지 마십시오 echo. 일반적으로 임의의 데이터를 표시하는 데 사용할 수 없습니다.
  • %우리가 전달해야 하는 텍스트는 printf이스케이프되어야 합니다 %%( 이것만으로도 파일 크기가 %s확장됩니다 ).feh
  • 우리는 작은따옴표(가장 강한따옴표)를 사용하여 작업 매개변수를 에 전달합니다 feh. 이 매개변수의 리터럴 의미는 입니다 printf "%%s\n" %F. 이는 feh호출하는 shell( /bin/sh)에게 3개의 인수를 사용하여 코드를 해석하도록 지시합니다: sh, -c해당 코드는 구문에서 올바르게 참조된 파일의 경로 %%로 변경되고 %해당 %F파일은 차례로 호출됩니다(대부분의 구현에 내장됨). 매개변수로 파일의 전체 경로를 지정합니다.shshprintfshprintf%s\n

답변2

안녕하세요 Stéphane, 훌륭한 답변에 감사드립니다.

나는 feh에 있는 동안 내가 가장 좋아하는 터미널 파일 관리자인 Ranger에서 파일에 태그를 지정할 수 있도록 귀하의 한 줄을 사용했습니다. 이를 위해 다음 매개변수를 사용했습니다.

feh -FZd --action 'printf "%%s\n" %F' "$PWD" >> ~/.local/share/ranger/tagged image.jpg

Ranger는 텍스트 파일 끝에 파일 경로를 추가하여 매우 간단하게 마커 이미지를 저장합니다. 이미지의 태그를 해제하면 해당 파일 경로가 제거됩니다.

하지만 레인저의 파일 오프너/실행 소총에 통합할 때 문제가 발생했습니다. Rifle은 본질적으로 파일을 여는 데 사용할 항목을 결정하기 위해 일부 파일 형식 검사를 수행하는 파일 실행기입니다. 위의 한 줄의 코드를 다음과 같이 소총에 추가했습니다.

mime ^image, has feh,      X, flag f = feh -FZd --action 'printf "%%s\n" %F' "$PWD" >> ~/.local/share/ranger/tagged -- "$@"

플래그 f는 프로세스를 분기하고 X는 그래픽 환경을 사용할 수 있음을 알려줍니다. 그리고 무언극 장르가 있습니다. 이들 중 어느 것도 문제를 일으키지 않습니다. 내 주장을 깨뜨리는 부분은 $@마지막 부분입니다.

이는 레인저에게 전류를 열도록 지시하는 데 유용합니다.집중된디렉토리 맨 위에서 시작하는 것이 아니라 파일을 사용하는 것입니다. 불행하게도 이 환경 변수를 매개 변수에 추가하면 ~/.local/share/ranger/tagged 파일 끝에 전체 파일 경로가 추가되지 않고 파일만 추가됩니다.이름.

예를 들어

이 사진:/home/$USER/photos/IMG_20221023_102228_HDR~2.jpg

다음과 같이 됩니다: IMG_20221023_102228_HDR~2.jpg

왜 이런 일이 발생하는지 잘 모르겠지만 환경 변수와 관련이 있다는 것은 알고 있습니다 $@. $@이를 제거하고 교체 하면 $1(선택한 n번째 파일 참조) 매개변수는 언급한 대로 다시 제대로 작동합니다. feh는 초점을 맞춘 파일이 아닌 디렉토리의 맨 위에서 시작합니다.

이것을 더 잘 설명할 수 없어서 죄송합니다. 이것이 의미가 있기를 바랍니다. 작동시키고 싶습니다!

PS 저는 여기서 질문을 해서는 안 된다는 것을 압니다. 비록 약간의 도움을 받으면 이것은 여전히 ​​원래 질문과 밀접하게 관련되어 있기 때문에 누군가의 대답이 될 수 있습니다.

관련 정보