Clipboard để sao chép và dán các tập tin trong dòng lệnh?


25

Trong Bash, giả sử tôi truy cập một thư mục, và sau đó một thư mục khác. Tôi muốn sao chép một tập tin từ thư mục đầu tiên sang thư mục thứ hai, nhưng không chỉ định tên đường dẫn dài của chúng. Có thể không?

Giải pháp tạm thời của tôi là sử dụng /tmpnhư một nơi tạm thời để lưu trữ một bản sao của tập tin. cp myfile /tmpkhi tôi ở thư mục thứ nhất và sau đó cp /tmp/myfile .khi tôi ở thư mục thứ hai. Nhưng tôi có thể kiểm tra xem tập tin có ghi đè lên bất cứ thứ gì không /tmp.

Có một cái gì đó tương tự như một bảng tạm để sao chép và dán một tập tin?


1
Bạn phải gõ cdlệnh, vì vậy bạn chỉ cần cd -quay lại thư mục trước đó, mũi tên lên để gọi lại cdlệnh và chỉnh sửa dòng sẽ cpthay thế cd. (ctrl-a (đầu dòng), alt-d (kill-word) cp -a, ctrl-e (cuối dòng)).
Peter Cordes

Với Emacs và M-x termbạn có thể sử dụng clipboard của Emacs.
Pål GD

1
Bạn có thể sử dụng Midnight Commander và quên đi việc nhảy qua các vòng.
Deer Hunter

@ PålGD Mọi người nói Emacs 'là một hệ điều hành ... Hầu hết đều có clipboard;)
Volker Siegel

@JeffSchaller cảm ơn ................................
Tim

Câu trả lời:


59

Sử dụng Bash, tôi sẽ chỉ truy cập các thư mục:

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

Sau đó, tôi sẽ sử dụng phím tắt ~-, trỏ đến thư mục trước:

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

Nếu ai đó muốn truy cập các thư mục theo thứ tự ngược lại, thì:

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

25
+1 Tôi đang sử dụng shell Unix / Linux trong hơn 20 năm nay và tôi không biết lối tắt đó.
Dubu

4
Huh, đó là một phím tắt tiện dụng cho "$OLDPWD". Tại sao ba cplệnh riêng biệt , mặc dù? cp -a ~-/file[1-3].txt .
Peter Cordes

4
Trên thực tế, ba cplà ví dụ. Trong thế giới thực, các ký tự đại diện cũng có thể được sử dụng để đơn giản hóa tác vụ sao chép.
Anderson Medeiros Gomes

2
Tôi sẽ đề cập đến một cái gì đó về pushdvà phân tích cú pháp dirs... nhưng điều này là rất xa, tốt hơn nhiều. Tôi đề nghị bạn thêm một thực tế "$OLDPWD"hoàn toàn tương đương ~-và dễ mang theo hơn (hữu ích cho những người không sử dụng bash.)
Wildcard

1
~+tương tự như một lối tắt cho"$PWD"
Paul Evans

11

Nếu tôi thấy tình huống đó diễn ra một lần, tôi có thể:

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

Nếu có các thư mục mà tôi thấy mình sao chép các tệp không thường xuyên, tôi có thể sẽ xác định một số biến số ghi nhớ cho chúng trong .profile của mình.

Chỉnh sửa để thêm:

Sau khi ngủ trên đó, tôi tự hỏi làm thế nào tôi có thể tiến gần đến các hành vi GUI / OS khác khi bạn chọn một số tệp, "cắt" hoặc "sao chép" chúng, sau đó "dán" chúng vào một nơi khác. Cơ chế lựa chọn tốt nhất tôi có thể đưa ra là bộ não / sở thích của bạn cộng với tính năng toàn cầu của vỏ. Tôi không sáng tạo lắm với việc đặt tên, nhưng đây là ý tưởng cơ bản (theo cú pháp 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
}

Để sử dụng nó, hãy đặt mã vào ~ / .bash_profile, sau đó cdđến thư mục nguồn và chạy copyfiles glob*herehoặc cutfiles glob*here. Tất cả những gì xảy ra là vỏ của bạn mở rộng các khối và đặt các tên tệp đó thành một mảng. Sau đó cd, bạn đến thư mục đích và chạy pastefiles, thực thi một cplệnh cho mỗi tệp nguồn. Nếu trước đây bạn đã "cắt" các tệp, thì các mục đích cũng loại bỏ tệp nguồn (hoặc, cố gắng). Điều này không thực hiện bất kỳ kiểm tra lỗi nào (của các tệp hiện có, trước khi có khả năng ghi đè chúng bằng cp; hoặc bạn có quyền xóa các tệp trong khi "cắt" hoặc bạn có thể truy cập lại thư mục nguồn sau khi bạn di chuyển ra ngoài của nó).


4
Đối với một lần của bạn, $OLDPWDđã tồn tại, có thể rút ngắn thành ~-bash và zsh.
Gilles 'SO- đừng trở nên xấu xa'

5

Tôi nghĩ rằng đây ~-là câu trả lời đúng, nhưng lưu ý rằng bash có trình chỉnh sửa dòng tích hợp có thể sao chép / dán văn bản.

Nếu bạn đang ở chế độ emacs, bạn có thể nhớ lại cdlệnh của mình từ lịch sử và sử dụng Control-uđể giết dòng vào bash "clipboard" được gọi là kill-ring (cũng có những cách khác). Sau đó, bạn có thể kéo chuỗi này thành một lệnh mới bất cứ lúc nào với Control-y. Rõ ràng, trong ví dụ của bạn, điều này phụ thuộc vào việc bạn đã sử dụng một tên thư mục tuyệt đối trong cdlệnh của bạn .

Bạn cũng có thể sử dụng ràng buộc khóa mặc định thú vị của Meta-.. Điều này sao chép từ cuối cùng từ lệnh trước vào dòng hiện tại của bạn. Nếu lặp lại, mỗi lần nó quay lại một lệnh trong lịch sử. Vì vậy, nếu bạn làm một cd /x, sau đó cd /ytiếp theo cdMeta-.Meta-., bạn sẽ có /xtrong đầu vào của bạn.


5

Mở rộng câu trả lời từ Anderson M. Gomes , Bash cho phép bạn tham khảo bất kỳ thư mục trước nào trong ngăn xếp thư mục của bạn bằng cách nhập ~N(hoặc ~+N) Nvị trí trên ngăn xếp dir. Ví dụ:

# 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

Bây giờ bạn có thể sao chép một tệp giữa hai thư mục trong quá khứ, không phải là thư mục hiện tại, với:

cp -v ~3/file1.txt ~2

Để giải quyết vấn đề của người gửi ban đầu, bạn sẽ làm:

$ 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 .

Với một tập hợp lớn các tệp, bạn có thể liệt kê tên của chúng trong tệp kê khai và sau đó thực hiện sao chép từ thư mục nguồn:

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

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

Xem thêm: phần này của trang Bash man


Tương tự, trong Tcsh, bạn có thể sử dụng =2ký hiệu (chứ không phải ~2) để chỉ đến thư mục thứ hai trên ngăn xếp thư mục của bạn.

Xem thêm: phần này của trang người đàn ông Tcsh


4

Khi bạn ở trong thư mục đầu tiên, hãy nói nguồn hoặc nói srcngắn gọn, thực thi

src=${PWD}

sau đó cdvào thư mục thứ hai và thực thi:

cp -i ${src}/filename .

các -itùy chọn sẽ hỏi bạn có muốn ghi đè lên, nếu có một tập tin trùng lặp


Cảm ơn. Nó thậm chí còn tốt hơn mà không chỉ định tên tệp.
Tim

4

Một biến thể về phản ứng anderson-m-gomes. Sử dụng Bash, tôi sẽ chỉ truy cập các thư mục:

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

Sau đó, tôi sẽ sử dụng biến $ OLDPWD, trỏ đến thư mục trước:

$ cp -v $OLDPWD/file1.txt .

Nếu ai đó muốn truy cập các thư mục theo thứ tự ngược lại, thì:

$ cp -v fileA.txt $OLDPWD/

3
+1, nhưng bạn đã quên "trích dẫn" các mở rộng biến của mình. Nếu $OLDPWDchứa không gian, điều này phá vỡ. Ngoài ra, tôi luôn luôn sử dụng cp -a. Ngoài ra, thật không may là việc hoàn thành tab bị hỏng khi mở rộng biến đổi. Tuy nhiên, bạn có thể sử dụng ctrl-alt-e để mở rộng dòng lệnh hiện tại, sau khi nhập phần $ OLDPWD.
Peter Cordes

1
~-là một lối tắt cho$OLDPWD
Gilles 'SO- ngừng trở nên xấu xa'

Tôi chỉ chỉ ra một biến thể khác, vì Unix / Linux có đầy đủ chúng. Thật buồn cười, tôi đã sử dụng Linux được hơn 20 năm và tôi chưa từng thấy ~ - trước đây. Thêm vào đó, $ OLDPWD rất dễ nhớ.
Scott Carlson

3

Nếu trong bash, tôi sẽ sử dụng Pushdpopd . Các lệnh này giữ một ngăn xếp thư mục FIFO tiện dụng để sử dụng sau. Bạn có thể tham khảo ngăn xếp bất cứ lúc nào bằng cách sử dụng dirs .

Như vậy tôi sẽ làm:

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

2

Bạn có thể sử dụng 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.

Thí dụ:

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

Cũng ghé thăm xsel .


Điều đó thực hiện tar | gzipvào / ra khỏi bảng tạm X. Kinda clunky so với cp, và không khái quát để tạo liên kết tượng trưng hoặc liên kết cứng. ( cp -ashoặc cp -al)
Peter Cordes

1

Bạn có thể xem clipboard-fileskịch bản tại đây: https://github.com/larspontoppidan/clipboard-files

Nó cung cấp các lệnh như ccopy, ccutcpastesử dụng clipboard môi trường máy tính để bàn và cho phép sao chép trực quan / dán các tập tin:

ccopy myfile
cd <second directory>
cpaste

Khi bảng tạm môi trường máy tính để bàn được sử dụng, bản sao / dán sẽ tương tác với các tệp được đặt trong bảng tạm trong các chương trình khác như trình quản lý tệp và IDE. Ít nhất là nó hoạt động trên máy tính để bàn giống như Gnome.

Tiết lộ đầy đủ, tôi đã viết kịch bản sau khi từ bỏ việc tìm kiếm một cái gì đó giống như nó ngoài kia ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.