Copiez et collez un fichier / répertoire à partir de la ligne de commande

17

Au lieu d'utiliser la commande suivante:

cp {fichier source} {fichier dest}

Je veux pouvoir copier un fichier dans le presse-papiers et le coller ailleurs, dans un autre répertoire. quelque chose comme ça:

/ usr / local / dir1 # cp {fichier source}
/ usr / local / dir1 # cd / usr / local / dir2
/ usr / local / dir2 # coller

C'est possible?

Meysam
la source

Réponses:

17

Je pense que vous devriez faire quelque chose comme le font les applications GUI. Mon idée pour cela est d'écrire deux fonctions pour Copier et Coller, où Copier écrit le chemin des fichiers à copier dans un fichier temporaire et Coller lit ces chemins et appelle simplement la cpcommande. Mon implémentation (à mettre en .bashrcfichier) est comme ci-dessous:

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
}

De meilleurs scripts pourraient être écrits pour implémenter cette idée, j'ai testé les miens et cela fonctionne très bien pour les fichiers et les dossiers (je ne sais pas comment cela xclippourrait fonctionner pour copier des dossiers !!)


Par exemple:

/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
la source
1
Ça fonctionne super bien!
Meysam
2
J'aime cette idée. Et avec peu de modifications, vous pourriez même implémenter une fonction "couper" aussi.
Pablo Venturino
@Gilles Pourriez - vous s'il vous plaît expliquer pourquoi vous avez remplacé echoavec printf?
Meysam
@Meysam Pour travailler même sous shopt -s xpg_echo.
Gilles 'SO- arrête d'être méchant'
1
@Meysam printfest portable et sûr alors qu'il echone l'est pas. Le wiki Wooledge le mentionne brièvement.
jw013
10

je suggère xclip. je l'utilise tout le temps pour ça. mais vous n'avez pas besoin d'un script. utilisez simplement des fonctions.

je ne vois pas la nécessité d'utiliser ces scripts, en particulier, parce que si vous faites ce que je pense que vous faites, vous trouverez les scripts déjà mentionnés (sur le blog utile de linux tidbits) ennuyeux car ils vous invitent à entrer dans la mesure du possible , juste de les utiliser, contrairement à la philosophie unix.

je suggère juste d'écrire quelques fonctions dans votre .bashrc:

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

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

pour les utiliser, vous devez apt-get install xclip(Debian, Ubuntu, Linux Mint, etc.) ou zypper in xclip(openSUSE, autres systèmes basés sur .rpm) ou un équivalent. le programme doit être disponible sur le système que vous utilisez.

ixtmixilix
la source
3

Vous pouvez utiliser la xclipcommande pour cela. Vous pouvez télécharger des scripts bash à partir de ce lien et mettre des alias pour bash cp2clipet bash clippastedans votre .bashrcfichier.

harish.venkat
la source
@ qu'entendez-vous par alias?
ixtmixilix
je voulais dire garder les fichiers dans votre répertoire personnel et mettre deux alias dans votre alias .bashrc cp2clip = 'bash / home / <username> /cp2clip.sh' et clippaste = 'bash / home / <username> /clippaste.sh' afin vous pouvez les utiliser n'importe où. Pour en savoir plus sur les alias, vous pouvez voir man aliasou linfo.org/alias.html
harish.venkat