Dolphin KDE에서 선택한 파일 경로를 얻고 zsh에 복사하여 붙여넣는 방법은 무엇입니까?

Dolphin KDE에서 선택한 파일 경로를 얻고 zsh에 복사하여 붙여넣는 방법은 무엇입니까?
➜  ~ cat .zshrc | grep xclip
alias c="xclip -selection c"
alias -g v='"$(xclip -selection c -o)"'
➜  ~ v
zsh: 没有那个文件或目录: file:///home/roach/Downloads/pure.png
➜  ~ 

"해당 파일이나 디렉터리가 없습니다"는 중국어로 "파일이나 디렉터리가 없습니다"라는 뜻입니다.

에 있는 파일을 복사하고 싶습니다 /home/roach/Downloads/pure.png. Dolphin KDE에서 선택하고 복사할 때(마우스 오른쪽 버튼을 클릭한 다음 복사를 클릭) 위에 표시된 /home/roach/Downloads/pure.png것 대신에 그것을 얻을 수 있는 방법이 있습니까?file:///home/roach/Downloads/pure.png

sed추가 문자 제거 file://와 같은 명령을 사용하고 있다고 생각했지만 올바른 방법을 얻지 못했습니다.

➜  ~ alias -g v='"$(xclip -selection c -o)|sed -e 's/file:\/\///'"'
➜  ~ v
zsh: 没有那个文件或目录: file:///home/roach/Downloads/pure.png|sed -e s/file:////
➜  ~ 

그렇다면 내 것을 어떻게 수정합니까 alias -g v?

답변1

쉘 자체가 이러한 교체를 수행할 수 있으므로 외부 프로그램의 더 비싼 포크 및 실행을 피할 수 있습니다. 자세한 내용은 "매개변수 확장"을 참조하십시오 zshexpn(1).

% x=file:///etc/passswd; print ${x#file://}
/etc/passswd

그래서 귀하의 경우에는 아마도 다음과 같을 것입니다.

% alias -g v='${$(xclip -selection c -o)#file://}'
% print -l v
/etc/passswd

이는 v다소 일반적인 문자이므로 전역 별칭으로 적합하지 않을 수 있습니다.

이름에 공백이 있는 항목을 처리하는 방법을 결정할 수도 있습니다. print -l다음 항목의 차이점이 드러납니다.

alias -g v='${$(xclip -selection c -o)#file://}'
alias -g v='${"$(xclip -selection c -o)"#file://}'

클립보드 내용에 공백이 있는 경우.

답변2

아시다시피 별칭은

alias -g v='"$(xclip -selection c -o)"'

즉, 을 호출하면 v셸은 클립보드 내용이라는 명령을 실행하려고 시도합니다. 이것이 첫 번째 코드 조각에서 일어나는 일입니다. 그러나 v그 효과를 호출하고 관찰하는 것은 의도된 용도로 인해 오해의 소지가 있습니다.글로벌별칭은 다른 명령에 대한 인수입니다.

sed명령 대체()를 사용하고 올바르게 인용하면 기반 솔루션이 작동합니다 .$(...)

alias -g v='$(xclip -selection clipboard -o | sed '"'"'s|^file://||'"'"')'

여기에서 xclip클립보드의 내용이 로 파이프되어 시작 부분이 sed제거됩니다 file://(패턴이 고정되어 있습니다 ^). 스크립트에서 명령 구분 기호를 사용하지 않으면 /읽기가 더 쉬워지고 패턴에서 이스케이프할 필요가 없어집니다. 명령 대체는 파이프의 출력이 호출된 곳에서 대체됨을 의미합니다.ssed/
v

그런 다음 다음과 같이 사용할 수 있습니다.

cp -- v /path/to/destination

v리터럴은 v항상 대체되므로 현재 작업 디렉토리에 명명된 파일을 작업하는 것이 더 어려워집니다 . 해결 방법으로 상대 경로를 사용할 수 있습니다 ./v.
(또한 일부 프로그램은 접두사가 없는 단일 문자 옵션을 허용한다는 점을 고려하십시오. 이는 완벽하게 합법적이지만 POSIX는 아닙니다 ps v. 단일 문자 전역 별칭은 안전하지 않습니다.)

마지막으로, 이러한 전역 별칭은 이름에 공백 문자가 포함된 파일에서는 작동하지 않습니다. 별칭을 바꾼 후 쉘에 의해 분할되기 때문입니다.

또는 전역 별칭 ​​사용을 피하고 다음을 정의할 수 있습니다.

alias v="xclip -selection clipboard -o | sed 's|^file://||'"

다음과 같이 사용할 수 있습니다.

cp -- "$(v)" /path/to/destination

이는 공백 문자가 포함된 파일 이름에도 적용됩니다.

하지만 참고하세요:

  1. 다음에 설명된 대로 셸의 대체 기능을 활용하세요.트리거의 답변, 효율성이 더 높아질 것입니다.
  2. Dolphin이 표시하고 클립보드에 복사한 파일 이름은 인코딩되어 있으므로 특이한 문자가 포함되어 있는 한 셸에서 사용하기에 적합하지 않습니다. 예를 들어:

    touch $'file with a\nnewline'
    # Copied in Dolphin
    % echo "$(v)"
    file with a%0Anewline
    % cat "$(v)"
    cat: '/path/to/file with a%0Anewline': No such file or directory
    

관련 정보