Schowek do kopiowania i wklejania plików w wierszu poleceń?

25

Załóżmy, że w Bash odwiedzam katalog, a następnie inny katalog. Chciałbym skopiować plik z pierwszego katalogu do drugiego katalogu, ale bez określania ich długich ścieżek. Czy to możliwe?

Moim tymczasowym rozwiązaniem jest użycie /tmpjako tymczasowego miejsca do przechowywania kopii pliku. cp myfile /tmpkiedy jestem w pierwszym katalogu, a potem cp /tmp/myfile .kiedy jestem w drugim katalogu. Ale mogę sprawdzić, czy plik coś nadpisze /tmp.

Czy istnieje coś podobnego do schowka do kopiowania i wklejania pliku?

Tim
źródło
1
Musisz wpisać cdpolecenie, abyś mógł po prostu cd -wrócić do poprzedniego katalogu, strzałka w górę, aby przywołać cdpolecenie, i edytować wiersz cpzamiast cd. (ctrl-a (początek linii), alt-d (słowo-zabójca) cp -a,, ctrl-e (koniec linii)).
Peter Cordes,
Z Emacsem M-x termmożesz korzystać ze schowka Emacsa.
Pål GD
1
Możesz użyć Midnight Commander i zapomnieć o skokach przez obręcze.
Deer Hunter,
@ PålGD Ludzie mówią, że Emacs to system operacyjny ... Większość ma schowki;)
Volker Siegel
@JeffSchaller dzięki ................................
Tim

Odpowiedzi:

59

Korzystając z Bash, po prostu odwiedzałbym katalogi:

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

Następnie użyłbym skrótu ~-, który wskazuje na poprzedni katalog:

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

Jeśli chcesz odwiedzić katalogi w odwrotnej kolejności, to:

$ cp -v fileA.txt ~-
$ cp -v fileB.txt ~-
$ cp -v fileC.txt ~-
Anderson Medeiros Gomes
źródło
25
+1 Używam powłok Unix / Linux od ponad 20 lat i nie znałem tego skrótu.
Dubu,
4
To jest przydatny skrót do "$OLDPWD". Dlaczego jednak trzy osobne cppolecenia? cp -a ~-/file[1-3].txt .
Peter Cordes,
4
Właściwie te trzy cpsą przykładami. W prawdziwym świecie można również użyć znaków wieloznacznych, aby uprościć zadanie kopiowania.
Anderson Medeiros Gomes
2
Chciałem wspomnieć o czymś pushdi analizie dirs... ale to jest o wiele lepsze. Proponuję dodać fakt, który "$OLDPWD"jest dokładnie równoważny ~-i bardziej przenośny (pomocny dla tych, którzy nie używają bash).
Wildcard,
1
~+jest również skrótem od"$PWD"
Paul Evans
11

Gdybym zobaczył tę sytuację jako jednorazową, mógłbym:

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

Gdyby istniały katalogi, z których kopiowałem pliki częściowo, prawdopodobnie zdefiniowałbym dla nich pewne zmienne mnemoniczne w moim .profile.

Edytowano, aby dodać:

Po spaniu zastanawiałem się, jak blisko mogę dotrzeć do innych zachowań GUI / OS, w których wybierasz pewną liczbę plików, „wycinasz” lub „kopiujesz” je, a następnie „wklejasz” gdzie indziej. Najlepszym mechanizmem selekcji, jaki mogłem wymyślić, był twój mózg / preferencje plus funkcja globowania powłoki. Nie jestem bardzo kreatywny w nazywaniu, ale to jest podstawowy pomysł (w składni 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
}

Aby z niego skorzystać, należy umieścić kod do ~ / .bash_profile, następnie cddo katalogu źródłowego i metę albo copyfiles glob*herealbo cutfiles glob*here. Wszystko, co się dzieje, to to, że twoja powłoka rozszerza globusy i umieszcza te nazwy plików w tablicy. Następnie cdprzejdź do katalogu docelowego i uruchom pastefiles, który wykonuje cppolecenie dla każdego pliku źródłowego. Jeśli pliki zostały wcześniej „wycięte”, pliki pastefile również usuwają plik źródłowy (lub próbuje to zrobić). Nie wykonuje to żadnego sprawdzania błędów (istniejących plików, przed potencjalnym zatkaniem ich za pomocą cp; lub czy masz uprawnienia do usuwania plików podczas „wycinania” lub że możesz ponownie uzyskać dostęp do katalogu źródłowego po przeprowadzce) tego).

Jeff Schaller
źródło
4
Dla twojego jednorazowego $OLDPWDjuż istnieje, które można skrócić ~-w bash i zsh.
Gilles 'SO - przestań być zły'
5

Myślę, że ~-to właściwa odpowiedź, ale zauważ, że bash ma wbudowany edytor linii, który może kopiować / wklejać tekst.

Jeśli jesteś w trybie emacsa, możesz przywołać swoje cdpolecenie z historii i użyć go, Control-uaby zabić linię do bashowego „schowka” zwanego zabójczym pierścieniem (są też inne sposoby). Następnie można ciągnąć ten ciąg do nowego polecenia w każdej chwili Control-y. Oczywiście w twoim przykładzie zależy to od tego, czy użyłeś bezwzględnej nazwy katalogu w swoim cdpoleceniu.

Możesz także użyć interesującego domyślnego przypisania klawiszy Meta-.. Spowoduje to skopiowanie ostatniego słowa z poprzedniego polecenia do bieżącego wiersza. Jeśli się powtórzy, za każdym razem wraca o jedno polecenie w historii. Więc jeśli zrobisz cd /x, a cd /ynastępnie cdMeta-.Meta-.będziesz miał /xswój wkład.

meuh
źródło
5

Rozwijając odpowiedź Andersona M. Gomesa , Bash pozwala odwoływać się do dowolnego wcześniejszego katalogu na stosie katalogów, wpisując ~N(lub ~+N) gdzie Njest pozycja na stosie katalogów . Na przykład:

# 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

Teraz możesz skopiować plik między dwoma wcześniejszymi katalogami, z których żaden nie jest bieżący, za pomocą:

cp -v ~3/file1.txt ~2

Aby rozwiązać problem z oryginalnym plakatem, wykonaj następujące czynności:

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

W przypadku dużego zestawu plików można wymienić ich nazwy w pliku manifestu, a następnie wykonać kopię ze źródłowego katalogu:

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

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

Zobacz także: ta sekcja strony podręcznika użytkownika Bash


Podobnie w Tcsh możesz użyć =2notacji (zamiast ~2), aby odnieść się do drugiego katalogu na stosie katalogów.

Zobacz także: ten rozdział strony podręcznika Tcsh

jskroch
źródło
4

gdy jesteś w pierwszym katalogu, powiedzmy, że źródło lub srcw skrócie, wykonaj

src=${PWD}

następnie cddo drugiego katalogu i wykonaj:

cp -i ${src}/filename .

-iopcja zapyta, czy chcesz zastąpić, jeśli istnieje duplikat pliku

MelBurslan
źródło
Dzięki. Jest to nawet lepsze bez podawania nazwy pliku.
Tim
4

Odmiana odpowiedzi anderson-m-gomes. Korzystając z Bash, po prostu odwiedzałbym katalogi:

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

Następnie użyłbym zmiennej $ OLDPWD, która wskazuje na poprzedni katalog:

$ cp -v $OLDPWD/file1.txt .

Jeśli chcesz odwiedzić katalogi w odwrotnej kolejności, to:

$ cp -v fileA.txt $OLDPWD/
Scott Carlson
źródło
3
+1, ale zapomniałeś „zacytować” swoje rozszerzenia rozszerzeń. Jeśli $OLDPWDzawiera spacje, łamie się. Poza tym zawsze używam cp -a. Ponadto niefortunnie jest, że uzupełnianie tabulatorów jest przerywane przy zmiennych rozszerzeniach. Możesz jednak użyć ctrl-alt-e do rozszerzenia bieżącego wiersza poleceń po wpisaniu części $ OLDPWD.
Peter Cordes,
1
~-to skrót od$OLDPWD
Gilles „SO- przestań być zły”
Właśnie wskazałem inną odmianę, ponieważ Unix / Linux jest ich pełen. Zabawne, że używam Linuksa od ponad 20 lat i nigdy wcześniej nie widziałem ~. Ponadto $ OLDPWD jest łatwy do zapamiętania.
Scott Carlson,
3

W bashu użyłbym pushd i popd . Te polecenia przechowują poręczny stos katalogów FIFO do późniejszego wykorzystania. Możesz sprawdzić stos w dowolnym momencie, korzystając z katalogów .

Jako taki zrobiłbym:

pushd .
cd /somewhere/else
cp "`popd`/myfile"
Rui F. Ribeiro
źródło
2

Możesz użyć 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.

Przykład:

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

Odwiedź także Xsel .

Pandya
źródło
Robi to tar | gzipdo / ze schowka X. Trochę niezgrabny w porównaniu do cpi nie generalizuje do tworzenia dowiązań symbolicznych lub dowiązań twardych. ( cp -aslub cp -al)
Peter Cordes,
1

Możesz sprawdzić clipboard-filesskrypt tutaj: https://github.com/larspontoppidan/clipboard-files

Zapewnia polecenia jak ccopy, ccuti cpasteże za pomocą schowka środowiska graficznego i umożliwiają intuicyjną kopii / wklejanie plików:

ccopy myfile
cd <second directory>
cpaste

Gdy używany jest schowek środowiska pulpitu, kopiowanie / wklejanie będzie oddziaływać z plikami umieszczonymi w schowku w innych programach, takich jak menedżery plików i IDE. Przynajmniej działa na komputerach podobnych do Gnome.

Pełne ujawnienie, napisałem scenariusz po rezygnacji ze znalezienia czegoś takiego ...

Larsp
źródło