서로 다른 작업 디렉터리에 두 개의 터미널이 있고 파일을 사용하지 않고 한 터미널의 PWD에서 다른 터미널의 PWD로 파일을 이동하려는 경우 mv
( mv
디렉터리 중 하나 이상을 입력해야 하기 때문)
bash 스크립트로 구현하면 매우 간단한 "잘라내기" 및 "붙여넣기" 기능을 얻을 수 있습니다.
# cut (pseudocode)
fname=<target>
mv <target> /tmp/the-cut-file
# paste
mv /tmp/the-cut-file ./$fname
이 기능을 처리하는 표준 도구가 있는지 궁금합니다. 그래서 직접 롤아웃할 필요가 없습니다(그리고 극단적인 경우를 처리하고 명령줄 자동 완성을 얻는 대신 유지 관리하는 등).
답변1
나는 당신이 원하는 것을 정확히 수행하는 도구를 모릅니다. 그렇다고 존재하지 않는다는 의미는 아니지만 일반적인 Linux 데스크톱에서는 찾을 가능성이 낮다는 의미입니다.
일반적인 가사 도구를 사용하여 개별 파일을 복사하여 붙여넣습니다.
정확하게 복사해서 붙여넣는 모델이 되지 않도록 요구 사항을 약간 변경하려는 경우 작업이 더 쉬워집니다. 복사-잘라내기-붙여넣기 모델이 수행하는 작업 중 하나는 소스 지점에서 잘라내기 대 복사 결정을 내리는 것입니다. 이로 인해 구현이 복잡해지고 파일에 대해 직관에 반하는 경우가 많습니다. 파일의 경우 소스에서 선택하고 대상에서 복사하거나 이동하는 것이 더 적합한 경우가 많습니다. 이 접근 방식을 사용하면 원본은 파일 이름 목록만 복사하면 되며 이동 또는 복사를 결정하지 않습니다.
일반적인 도구를 사용하면 파일 이름을 클립보드에 복사하는 것이 매우 쉽습니다.xsel
또는xclip
X11 pbcopy
및 pbpaste
macOS에서. 바라보다내용을 표시하지 않고 파일 내용을 클립보드에 복사합니다.그리고래핑하지 않고 터미널에서 4k 이상의 입력을 어떻게 읽을 수 있습니까?. xsel
일반적으로 xclip
기본적으로 설치되지는 않지만, 패키지로 제공되는 경우가 많습니다. xsel
입력하는 데 시간이 덜 걸리고 다른 도구도 비슷하기 때문에 예제에서는 이것을 사용 하겠습니다 . xsel
실제로 큰 입력에는 문제가 있지만 일반적인 파일 이름에는 문제가 되지 않습니다.
다음 코드 예제에서는 파일 이름이 개행 문자로 끝나지 않는다고 가정합니다.
zsh 및 xsel의 경우 단일 파일 또는 디렉터리의 복사-붙여넣기 예는 다음과 같습니다.
/some/where% xsel <<<$PWD/myfile
/else/where% cp `xsel` .
bash 또는 ksh의 경우 큰따옴표가 필요합니다.
/some/where$ xsel <<<"$PWD/myfile"
/else/where$ cp -p "`xsel`" .
파일 이름에 셸 특수 문자가 포함되어 있으면 명령줄에 직접 붙여넣을 수 없습니다.
여러 파일 처리
여러 파일을 처리하는 가장 쉬운 방법은 여러 파일을 처리하지 않는 것입니다. 여러 파일을 복사하려면 대상 터미널에서 대상 디렉터리(이름)를 복사하여 원본 터미널에 붙여넣습니다.
/else/where$ xsel <<<"$PWD"
/some/where$ cp -Rp file1 file2 *.more.files "`xsel`"
cfn
( 라는 파일이 있습니다 .씨오피에프엘리Name)는 기본적으로 인수를 $PWD/
클립보드에 복사하지만 좀 더 견고성을 추가합니다. 여러 인수를 지원하고 X 선택과 클립보드 모두에 복사하며 절대 및 상대 파일 이름 모두에서 작동하며 Windows에서 지원되는 다음 옵션이 있습니다. 길. null 구분 기호를 사용하도록 개선할 수 있으며, 그러면 파일 이름에 줄 바꿈을 지원합니다.
#! /bin/sh
# Copy file name
if [ "$#" -eq 0 ] || [ "$1" = "--help" ]; then
cat <<EOF
Usage: $0 [OPTION]... FILENAME [...]
Copy FILENAME to both the X clipboard and the primary selection.
If FILENAME is relative, prepent \$PWD.
Multiple FILENAMEs are separated by newlines, but no newline is added at the
end.
-F Do not add a newline after the last file name (default)
-f Do add a newline after the last file name
-p PREFIX Prefix to use instead of \$PWD
-r ROOT Prefix to use before ROOT
-s STRING Separator to use instead of a newline
-u Use slash as the path separator (default)
-w Use backslash instead of slash as the path separator
EOF
exit
fi
set -e -f
append=
cwd="$PWD/"
explicit_cwd=
names=
nl='
'
root=
sep='/'
change_separator () {
if [ -z "$1" ]; then
eval "$var="
return
fi
IFS=/
var=$1
eval "set \$$var; $var=\$1"
shift
if [ "$1" != "" ]; then
set "$@" ""
fi
while [ "$#" -ne 0 ]; do
eval "$var=\$$var\$sep\$1"
shift
done
}
while getopts Ffuwp:r:s: OPTLET; do
case "$OPTLET" in
F) append=;;
f) append=1;;
p) cwd="$OPTARG"; explicit_cwd=1;;
r) root="$OPTARG";;
s) nl="$OPTARG";;
u) sep="/";;
w) sep="\\";;
*) echo 1>&2 "$0: unknown option: -$OPTLET"; exit 3;;
esac
done
shift "$((OPTIND-1))"
if [ -z "$explicit_cwd" ] && [ "$sep" != "/" ]; then
change_separator cwd
fi
for x do
case $x in
.) x=${cwd%"$sep"};;
[!/]*)
if [ "$sep" != "/" ]; then
change_separator x
fi
x="$cwd$x";;
*)
if [ "$sep" != "/" ]; then
change_separator x
fi;;
esac
names="$names$root$x$nl"
done
if [ -z "$append" ]; then
names=${names%"$nl"}
fi
printf %s "$names" | xsel
printf %s "$names" | xsel -b
여기에는 붙여넣기 스크립트가 없습니다. zsh에 여러 파일(줄바꿈으로 구분된 이름)을 붙여넣는 방법은 다음과 같습니다.
/else/where% cp -p ${(f)$(xsel)} .
배쉬에서:
/else/where$ readarray -t a < <(xsel) && cp -p "${a[@]}" .