명령 행에서 파일을 복사하여 붙여 넣기위한 클립 보드?


25

Bash에서 디렉토리를 방문한 다음 다른 디렉토리를 방문한다고 가정하십시오. 첫 번째 디렉토리에서 두 번째 디렉토리로 파일을 복사하지만 긴 경로 이름을 지정하지 않고 싶습니다. 가능합니까?

내 임시 해결책은 /tmp파일 사본을 저장하는 임시 장소로 사용하는 것입니다. cp myfile /tmp첫 번째 디렉토리에 cp /tmp/myfile .있을 때 두 번째 디렉토리에있을 때 그러나 파일이의 내용을 덮어 쓰는지 확인할 수 있습니다 /tmp.

파일을 복사하여 붙여 넣을 때 클립 보드와 비슷한 것이 있습니까?


1
cd명령 을 입력해야 하므로 cd -이전 디렉토리로 돌아가서 위쪽 화살표를 눌러 cd명령 을 호출하고 cp대신 줄을 편집하십시오 cd. (ctrl-a (라인 시작), alt-d (kill-word) cp -a, ctrl-e (라인 끝)).
Peter Cordes

Emacs M-x term를 사용하면 Emacs의 클립 보드를 사용할 수 있습니다.
Pål GD

1
Midnight Commander를 사용하여 농구대를 뛰어 넘을 수 있습니다.
사슴 사냥꾼

@ PålGD 사람들은 Emacs가 운영 체제라고 말합니다 ... 대부분 클립 보드가 있습니다.)
Volker Siegel

@JeffSchaller 감사합니다 ................................
Tim

답변:


59

Bash를 사용하여 디렉토리를 방문합니다.

$ cd /path/to/source/directory
$ cd /path/to/destination/directory

그런 다음 바로 가기를 사용 ~-하여 이전 디렉토리를 가리 킵니다.

$ cp -v ~-/file1.txt .
$ cp -v ~-/file2.txt .
$ cp -v ~-/file3.txt .

디렉토리를 역순으로 방문하려면 다음을 수행하십시오.

$ cp -v fileA.txt ~-
$ cp -v fileB.txt ~-
$ cp -v fileC.txt ~-

25
+1 저는 20 년 넘게 유닉스 / 리눅스 쉘을 사용하고 있는데 그 지름길을 몰랐습니다.
Dubu

4
허, 그것은 편리한 바로 가기입니다 "$OLDPWD". cp그래도 왜 세 개의 명령이 따릅니 까? cp -a ~-/file[1-3].txt .
Peter Cordes

4
실제로 세 가지 cp예입니다. 실제로는 와일드 카드 문자를 사용하여 복사 작업을 단순화 할 수도 있습니다.
앤더슨 Medeiros 고메스

2
나는 뭔가에 대해 언급 pushd하고 파싱 하려고 dirs... ...이 훨씬 낫다. 난 당신이 실제로 추가 제안 "$OLDPWD"정확히 동일하다 ~-더 이식 (사용하지 않는 사람들을 위해 도움을 bash.)
와일드 카드

1
~+바로 가기 마찬가지로입니다"$PWD"
폴 에반스

11

그 상황이 일회성으로 나오는 것을 본다면,

a=`pwd`
cd /somewhere/else
cp "$a/myfile" .

반 정기적으로 파일을 복사하는 디렉토리가있는 경우 내 .profile에서 일부 니모닉 변수를 정의합니다.

추가하기 위해 편집 :

그것에 대해 자고 난 후에, 나는 당신이 몇 개의 파일을 선택하고 "잘라 내기"또는 "복사"한 다음 다른 곳에 "붙여 넣기"하는 다른 GUI / OS 동작에 얼마나 가까이 접근 할 수 있을지 궁금했습니다. 내가 선택할 수있는 가장 좋은 선택 메커니즘은 두뇌 / 환경 설정과 껍질의 장갑 기능입니다. 나는 이름을 짓는 것에 독창적이지 않지만 이것은 기본 아이디어입니다 (Bash 구문에서).

function copyfiles {
  _copypastefiles=("$@")
  _copypastesrc="$PWD"
  _copypastemode=copy
}

function cutfiles {
  _copypastefiles=("$@")
  _copypastesrc="$PWD"
  _copypastemode=cut
}

function pastefiles {
  for f in "${_copypastefiles[@]}"
  do
    cp "${_copypastesrc}/$f" .
    if [[ ${_copypastemode} = "cut" ]]
    then
      rm "${_copypastesrc}/$f"
    fi
  done
}

그것을 사용하려면 ~ / .bash_profile을, 다음에 코드를 넣어 cd소스 디렉토리 및 실행에 하나 copyfiles glob*here또는 cutfiles glob*here. 쉘이 글로브를 확장하고 해당 파일 이름을 배열에 넣는 것입니다. 그런 다음 cd대상 디렉토리 로 이동하여 pastefiles를 실행하면 cp각 소스 파일에 대한 명령 이 실행 됩니다. 이전에 파일을 "잘라낸"경우 pastefiles도 소스 파일을 제거하거나 시도합니다. 이것은 기존 파일에 대해 오류 검사를 수행하지 않습니다 cp. 그것의).


4
일회성으로 $OLDPWD이미 존재 ~-하며 bash 및 zsh에서 단축 할 수 있습니다 .
Gilles 'SO- 악마 중지

5

나는 이것이 ~-정답 이라고 생각 하지만 bash에는 텍스트를 복사 / 붙여 넣을 수 있는 내장 라인 편집기 가 있습니다.

당신이 이맥스 모드에있는 경우 당신이 호출 할 수 있습니다 cd역사에서 명령 및 사용을 Control-u위해 죽일 킬 (kill) 링이라는 bash는 "클립 보드"로 선을 (다른 방법도있다). 그런 다음 언제든지을 사용 하여이 문자열을 새 명령에 넣을 수 있습니다 Control-y. 분명히, 귀하의 예에서 이것은 cd명령 에 절대 디렉토리 이름을 사용한 것에 달려 있습니다 .

흥미로운 기본 키 바인딩을 사용할 수도 있습니다 Meta-.. 그러면 이전 명령 의 마지막 단어 가 현재 줄로 복사 됩니다. 반복하면 기록에서 하나의 명령으로 되돌아갑니다. 당신이 할 경우 그래서 cd /x, 다음, cd /y다음에 cdMeta-.Meta-.있을 것이다 당신이 /x당신의 입력에.


5

Anderson M. Gomes의 답변을 확장하여 Bash를 사용하면 디렉토리 스택 의 위치를 ~N(또는 ~+N) 를 입력하여 디렉토리 스택의 이전 디렉토리를 참조 할 수 있습니다 N. 예를 들면 다음과 같습니다.

# go some places
$ cd /path/to/source/directory
$ pushd /path/to/destination/directory
$ pushd $HOME
$ pushd /tmp

# show the current dir stack
$ dirs -v
0 /tmp
1 ~
2 /path/to/destination/directory
3 /path/to/source/directory

이제 다음을 사용하여 두 개의 과거 디렉토리 사이에서 파일을 복사 할 수 있습니다.

cp -v ~3/file1.txt ~2

원래 포스터의 문제를 해결하려면 다음을 수행하십시오.

$ cd /path/to/source/directory
$ pushd /path/to/destination/directory

# show the current dir stack
$ dirs -v
0 /path/to/destination/directory
1 /path/to/source/directory

# copy
cp -v ~1/file[123].txt .

많은 파일 세트를 사용하면 이름을 매니페스트 파일에 나열한 다음 소스 디렉토리에서 복사를 수행 할 수 있습니다.

$ cd /path/to/destination/directory
$ pushd /path/to/source/directory

# copy
cp -v $(cat files_to_copy.list) ~1

참조 : Bash 매뉴얼 페이지의이 섹션


마찬가지로 Tcsh에서는 =2(이 아닌 ~2) 표기법을 사용 하여 디렉토리 스택의 두 번째 디렉토리를 참조 할 수 있습니다 .

참조 : Tcsh 매뉴얼 페이지의이 섹션


4

첫 번째 디렉토리에있을 때 소스를 말하거나 src간단히 말하면 실행하십시오.

src=${PWD}

그런 다음 cd두 번째 디렉토리로 이동하여 다음 을 실행하십시오.

cp -i ${src}/filename .

-i당신이 덮어 쓸 경우 중복 된 파일이있는 경우 옵션은 요청합니다


감사. 파일 이름을 지정하지 않아도 더 좋습니다.
Tim

4

anderson-m-gomes 응답의 변형입니다. Bash를 사용하여 디렉토리를 방문합니다.

$ cd /path/to/source/directory
$ cd /path/to/destination/directory

그런 다음 이전 디렉토리를 가리키는 변수 $ OLDPWD를 사용합니다.

$ cp -v $OLDPWD/file1.txt .

디렉토리를 역순으로 방문하려면 다음을 수행하십시오.

$ cp -v fileA.txt $OLDPWD/

3
+1이지만 변수 확장을 "인용"하는 것을 잊었습니다. $OLDPWD공백이 있으면 끊어집니다. 또한 항상 사용 cp -a합니다. 또한 변수 확장에서 탭 완성이 깨지는 것은 유감입니다. 그러나 $ OLDPWD 부품을 입력 한 후 ctrl-alt-e를 사용하여 현재 명령 행을 쉘 확장 할 수 있습니다.
Peter Cordes 2016 년

1
~-에 대한 바로 가기입니다$OLDPWD
질 'SO-정지 존재 악마'

유닉스 / 리눅스로 가득 차 있기 때문에 다른 변형을 지적했습니다. 웃기는, 20 년 이상 Linux를 사용해 왔으며, ~-전에는 본 적이 없습니다. 또한 $ OLDPWD는 기억하기 쉽습니다.
Scott Carlson

3

bash에 있다면 pushd and popd 사용 합니다. 이 명령은 나중에 사용할 수 있도록 편리한 FIFO 디렉토리 스택을 유지합니다. dirs를 사용하여 언제든지 스택을 참조 할 수 있습니다 .

따라서 나는 할 것입니다 :

pushd .
cd /somewhere/else
cp "`popd`/myfile"

2

당신은 사용할 수 있습니다 xclip:

NAME
       xclip - command line interface to X selections (clipboard)

SYNOPSIS
       xclip [OPTION] [FILE]...

DESCRIPTION
       Reads  from standard in, or from one or more files, and makes the data available as an X selection for pasting
       into X applications. Prints current X selection to standard out.

예:

$ cd /path/to/dir1
$ xclip-copyfile file1 file2
$ cd /path/to/dir2
$ xclip-pastefile
file1 file2

xsel 도 방문하십시오 .


그것은 tar | gzipX 클립 보드에 들어오고 나가는 것입니다. 킨다는에 비해 cp어색하고 심볼릭 링크 또는 하드 링크를 만드는 것을 일반화하지 않습니다. ( cp -ascp -al)
피터 코르

1

https://github.com/larspontoppidan/clipboard-files 에서 clipboard-files스크립트를 확인할 수 있습니다.

이 같은 명령을 제공 ccopy, ccutcpaste데스크톱 환경의 클립 보드를 사용하여 파일로 붙여 넣기 / 직관적 사본을 허용한다 :

ccopy myfile
cd <second directory>
cpaste

데스크탑 환경 클립 보드가 사용되므로 복사 / 붙여 넣기는 파일 관리자 및 IDE와 같은 다른 프로그램에서 클립 보드에 놓인 파일과 상호 작용합니다. 최소한 Gnome과 같은 데스크탑에서 작동합니다.

전체 공개, 나는 그와 같은 것을 찾는 것을 포기한 후 스크립트를 썼습니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.