Área de transferência para copiar e colar arquivos na linha de comando?

25

No Bash, suponha que eu visite um diretório e depois outro diretório. Gostaria de copiar um arquivo do primeiro diretório para o segundo diretório, mas sem especificar os nomes de caminho longos deles. É possível?

Minha solução temporária é usar /tmpcomo local temporário para armazenar uma cópia do arquivo. cp myfile /tmpquando estou no primeiro diretório e depois cp /tmp/myfile .quando estou no segundo diretório. Mas posso verificar se o arquivo substituirá algo /tmp.

Existe algo semelhante a uma área de transferência para copiar e colar um arquivo?

Tim
fonte
11
Você precisa digitar o cdcomando, para cd -voltar ao diretório anterior, seta para cima para recuperar o cdcomando e editar a linha a ser em cpvez de cd. (ctrl-a (início da linha), alt-d (palavra cp -afinal ) , ctrl-e (fim de linha)).
Peter Cordes
Com o Emacs e M-x termvocê pode usar a área de transferência do Emacs.
Pål GD
11
Você pode usar o Midnight Commander e esquecer de pular pelos aros.
Deer Hunter
@ PålGD As pessoas dizem que o Emacs 'é um sistema operacional ... A maioria tem pranchetas;)
Volker Siegel
@JeffSchaller thanks ................................
Tim

Respostas:

59

Usando o Bash, eu apenas visitava os diretórios:

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

Então, eu usaria o atalho ~-, que aponta para o diretório anterior:

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

Se alguém quiser visitar diretórios na ordem inversa, então:

$ cp -v fileA.txt ~-
$ cp -v fileB.txt ~-
$ cp -v fileC.txt ~-
Anderson Medeiros Gomes
fonte
25
+1 Estou usando shells Unix / Linux há mais de 20 anos e não conhecia esse atalho.
Dubu
4
Esse é um atalho útil para "$OLDPWD". Por que três cpcomandos separados , no entanto? cp -a ~-/file[1-3].txt .
Peter Cordes
4
Na verdade, os três cpsão exemplos. No mundo real, caracteres curinga também podem ser usados ​​para simplificar a tarefa de cópia.
Anderson Medeiros Gomes
2
Eu ia mencionar algo sobre pushde analisar dirs... mas isso é muito, muito melhor. Eu sugiro que você adicionar o fato de que "$OLDPWD"é exatamente equivalente a ~-e é mais portátil (útil para aqueles que não usam bash.)
Wildcard
11
~+é igualmente um atalho para"$PWD"
Paul Evans
11

Se eu visse essa situação como pontual, eu poderia:

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

Se houvesse diretórios nos quais eu copiava arquivos semi-regularmente, provavelmente definiria algumas variáveis ​​mnemônicas para eles no meu perfil.

Editado para adicionar:

Depois de dormir nele, me perguntei o quão perto eu poderia chegar a outros comportamentos da GUI / OS em que você seleciona algum número de arquivos, "recorta" ou "copia" e depois os "cola" em outro lugar. O melhor mecanismo de seleção que eu pude criar foi o seu cérebro / preferências, além do recurso brilhante da concha. Não sou muito criativo com nomes, mas esta é a ideia básica (na sintaxe do 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
}

Para usá-lo, coloque o código em ~ / .bash_profile, depois cdno diretório de origem e execute copyfiles glob*hereou cutfiles glob*here. Tudo o que acontece é que seu shell expande os globs e coloca esses nomes de arquivos em uma matriz. Você então executa cdo diretório de destino e pastefilesexecuta um cpcomando para cada arquivo de origem. Se você já "cortou" os arquivos, os arquivos de pasta também removerão o arquivo de origem (ou tentam). Isso não realiza nenhuma verificação de erro (dos arquivos existentes, antes de potencialmente esbarrá-los com o;; cpou você tem permissões para remover os arquivos durante um "corte" ou pode acessar novamente o diretório de origem depois de sair) ).

Jeff Schaller
fonte
4
Para o seu caso único, $OLDPWDjá existe, que pode ser reduzido para ~-bash e zsh.
Gilles 'SO- stop being evil
5

Eu acho que ~-é a resposta certa, mas observe que o bash possui um editor de linha interno que pode copiar / colar texto.

Se você estiver no modo emacs, poderá recuperar seu cdcomando do histórico e usar Control-upara matar a linha na "área de transferência" do bash chamada de kill-ring (existem outras maneiras também). Em seguida, você pode puxar essa sequência para um novo comando a qualquer momento com Control-y. Obviamente, no seu exemplo, isso depende de você ter usado um nome de diretório absoluto em seu cdcomando.

Você também pode usar a interessante ligação de chave padrão de Meta-.. Isso copia a última palavra do comando anterior para sua linha atual. Se repetido, cada vez que retorna um comando no histórico. Então, se você fizer um cd /x, cd /yseguido de cdMeta-.Meta-.você terá /xem sua entrada.

meuh
fonte
5

Expandindo a resposta de Anderson M. Gomes , o Bash permite que você se refira a qualquer diretório anterior na pilha de diretórios, digitando ~N(ou ~+N) onde Nestá a posição na pilha de diretórios. Por exemplo:

# 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

Agora você pode copiar um arquivo entre dois diretórios anteriores, nenhum deles o atual, com:

cp -v ~3/file1.txt ~2

Para resolver o problema do pôster original, você faria:

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

Com um grande conjunto de arquivos, você pode listar seus nomes em um arquivo de manifesto e, em seguida, fazer a cópia do diretório de origem:

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

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

Consulte também: esta seção da página de manual do Bash


Da mesma forma, no Tcsh, você pode usar a =2notação (em vez de ~2) para se referir ao segundo diretório na sua pilha de diretórios.

Consulte também: esta seção da página do manual Tcsh

jskroch
fonte
4

quando você estiver no primeiro diretório, digamos a fonte ou src, resumindo, execute

src=${PWD}

depois cdno segundo diretório e execute:

cp -i ${src}/filename .

a -iopção perguntará se você deseja substituir, se há um arquivo duplicado

MelBurslan
fonte
Obrigado. É ainda melhor sem especificar o nome do arquivo.
Tim
4

Uma variação na resposta de anderson-m-gomes. Usando o Bash, eu apenas visitava os diretórios:

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

Então, eu usaria a variável $ OLDPWD, que aponta para o diretório anterior:

$ cp -v $OLDPWD/file1.txt .

Se alguém quiser visitar diretórios na ordem inversa, então:

$ cp -v fileA.txt $OLDPWD/
Scott Carlson
fonte
3
+1, mas você esqueceu de "citar" suas expansões variáveis. Se $OLDPWDcontiver espaços, isso será interrompido. Além disso, eu sempre uso cp -a. Além disso, é lamentável que o preenchimento de guias seja interrompido em expansões variáveis. Você pode usar ctrl-alt-e para expandir a linha de comando atual, após digitar a parte $ OLDPWD.
Peter Cordes
11
~-é um atalho para$OLDPWD
Gilles 'SO- stop be evil'
Eu estava apenas apontando outra variação, já que o Unix / Linux está cheio delas. Engraçado, eu uso o Linux há mais de 20 anos e nunca tinha visto ~ - antes. Além disso, é fácil lembrar do $ OLDPWD.
22416 Scott Schaffner
3

Se no bash, eu usaria pushd e popd . Esses comandos mantêm uma pilha FIFO útil de diretórios para uso posterior. Você pode consultar a pilha a qualquer momento usando dirs .

Como tal, eu faria:

pushd .
cd /somewhere/else
cp "`popd`/myfile"
Rui F Ribeiro
fonte
2

Você pode usar 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.

Exemplo:

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

Visite também xsel .

Pandya
fonte
Isso tar | gzipentra / sai da área de transferência do X. Meio desajeitado em comparação com cp, e não generaliza, para criar links simbólicos ou hardlinks. ( cp -asou cp -al)
Peter Cordes
1

Você pode conferir o clipboard-filesscript aqui: https://github.com/larspontoppidan/clipboard-files

Ele fornece comandos como ccopy, ccute cpasteque usar a prancheta ambiente de trabalho e permitir cópia intuitiva / colar de arquivos:

ccopy myfile
cd <second directory>
cpaste

À medida que a área de transferência do ambiente de área de trabalho é usada, a cópia / colagem irá interagir com os arquivos colocados na área de transferência em outros programas, como gerenciadores de arquivos e IDE. Pelo menos, funciona em desktops semelhantes ao Gnome.

Divulgação completa, eu escrevi o roteiro depois de desistir de encontrar algo parecido por aí ...

Larsp
fonte