Copie e cole um arquivo / diretório na linha de comando

17

Em vez de usar o seguinte comando:

cp {arquivo de origem} {arquivo de destino}

Quero poder copiar um arquivo para a área de transferência e colá-lo em outro lugar, em outro diretório. algo assim:

/ usr / local / dir1 # cp {arquivo de origem}
/ usr / local / dir1 # cd / usr / local / dir2
/ usr / local / dir2 # paste

É possível?

Meysam
fonte

Respostas:

17

Eu acho que você deve fazer algo como os aplicativos GUI. Minha idéia para fazer isso é escrever duas funções para Copy and Paste, onde Copy grava o caminho dos arquivos a serem copiados em um arquivo temporário e Paste lê esses caminhos e simplesmente chama o cpcomando. Minha implementação (para ser .bashrcarquivada) é como abaixo:

function Copy {
    touch ~/.clipfiles
    for i in "$@"; do
      if [[ $i != /* ]]; then i=$PWD/$i; fi
      i=${i//\\/\\\\}; i=${i//$'\n'/$'\\\n'}
      printf '%s\n' "$i"
    done >> ~/.clipfiles
}

function Paste {
    while IFS= read src; do
      cp -Rdp "$src" .
    done < ~/.clipfiles
    rm ~/.clipfiles
}

Scripts melhores poderiam ser escritos para implementar essa idéia, testei a minha própria e funciona muito bem para arquivos e pastas (não sei como xclippoderia funcionar para copiar pastas !!)


Por exemplo:

/usr/local/dir1# Copy a.txt *.cpp
/usr/local/dir1# cd /usr/local/dir2
/usr/local/dir2# Paste

/usr/local/dir1# Copy *.h *.cpp b.txt subdir1
/usr/local/dir1# cd /usr/local/dir2
/usr/local/dir2# Paste

/usr/local/dir1# Copy a.txt b.txt 
/usr/local/dir1# cd /usr/local/dir2
/usr/local/dir2# Copy c.txt d.txt
/usr/local/dir2# cd /usr/local/dir3
/usr/local/dir3# Paste
saeedn
fonte
1
Isso funciona como um encanto!
Meysam
2
Eu gosto desta ideia. E com pequenas modificações, você também pode implementar uma função de "corte".
Pablo Venturino
@Gilles Poderia explicar por que você substituiu echocom printf?
Meysam
@Meysam Para trabalhar mesmo com menos shopt -s xpg_echo.
Gilles 'SO- stop be evil'
1
@Meysam printfé portátil e seguro, enquanto echonão é. O wiki do Wooledge menciona isso brevemente.
Jw013
10

Eu sugiro xclip. eu uso o tempo todo para isso. mas você não precisa de um script. basta usar funções.

não vejo necessidade de usar esses scripts, em particular, porque se você estiver fazendo o que eu acho que você está fazendo, você encontrará os scripts já mencionados (no útil blog linux tidbits) irritante porque eles solicitam a entrada sempre que possível , apenas usá-los, ao contrário da filosofia unix.

Sugiro apenas escrever algumas funções no seu .bashrc:

clip2file () {
  xclip -out -selection clipboard >> $@
  echo -e "\n" >> $@
}

file2clip () {
  cat $@ | xclip -selection clipboard
}

Para usá-los, você precisa apt-get install xclip(Debian, Ubuntu, Linux Mint, etc.) ou zypper in xclip(openSUSE, outros sistemas baseados em .rpm) ou algo equivalente. o programa deve estar disponível em qualquer sistema que você estiver usando.

ixtmixilix
fonte
3

Você pode usar o xclipcomando para isso. Você pode baixar scripts bash de este link e colocar apelidos para bash cp2clipe bash clippasteem seu .bashrcarquivo.

harish.venkat
fonte
@O que você quer dizer com pseudônimos?
Ixtmixilix
eu quis dizer manter os arquivos no diretório inicial e colocar dois apelidos no seu .bashrc apelido cp2clip = 'bash / home / <nome do usuário> /cp2clip.sh' e clippaste = 'bash / home / <nome do usuário> /clippaste.sh' você pode usá-los em qualquer lugar. Para ler mais sobre aliases, você pode ver man aliasou linfo.org/alias.html
harish.venkat