이것ㅋㅋㅋ명령을 사용하면 폴더의 이미지를 반복적으로 볼 수 있습니다.
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
파일은 차례로 호출됩니다(대부분의 구현에 내장됨). 매개변수로 파일의 전체 경로를 지정합니다.sh
sh
printf
sh
printf
%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 저는 여기서 질문을 해서는 안 된다는 것을 압니다. 비록 약간의 도움을 받으면 이것은 여전히 원래 질문과 밀접하게 관련되어 있기 때문에 누군가의 대답이 될 수 있습니다.