Posso evitar digitar a chave em cp -i?

5

Muitas vezes, eu preciso arquivar seletivamente uma longa lista de arquivos usando cp -iar , ou similar, e para acelerar o processo, eu gostaria de pressionar apenas uma tecla em vez de y ou n seguido de ENTER em todos os arquivos. Em outras palavras, eu quero evitar ter que pressionar ENTER , bem como y ou n . É claro que eu ficaria feliz em usar chaves diferentes em vez de y ou n .

Existe uma maneira de fazer isso?

    
por Harry Weston 27.04.2014 / 17:57

7 respostas

7

Eu acho que o que você precisa é de um gerenciador de arquivos, como o comando da meia-noite. No mc você pode selecionar vários arquivos com insert ou + e realizar operações neles, como apagar, mover ou copiar. Um conjunto completo de instruções e dicas pode ser encontrado no Tutorial .

Se você tentar puramente os comandos shell (sem gui), suponha que você tenha o arquivo 0 para o arquivo 10, mas queira copiar apenas o arquivo1 e o arquivo3:

cp file1 file3 directory/

Claro, você pode usar o shell para se ajudar:

cp file{1,3} directory/

mas e os consecutivos? arquivo5 a arquivo10?

cp file{5..10} directory/

Você também pode usar find para ajudar, se quiser algo mais avançado, por exemplo:

find Downloads -name "*.cfg" -exec cp {} directory \;

fará isso:

copy Downloads/file(6).cfg to directory
copy Downloads/file(7).cfg to directory
copy Downloads/file(1).cfg to directory
copy Downloads/file.cfg to directory
copy Downloads/file(2).cfg to directory
copy Downloads/file(4).cfg to directory
copy Downloads/file(3).cfg to directory
copy Downloads/file(5).cfg to directory

você pode verificar os arquivos a serem copiados, removendo a parte -exec ... . Você também pode usar -exec echo cp ... caso queira saber o que a localização fará.

    
por 27.04.2014 / 18:31
3

Sim, você pode, mas é um pouco complicado.
Aqui eu sugiro este script bash, salve-o em um arquivo chamado mycp.sh para ser colocado em seu PATH e não esqueça de chmod +x mycp. . Obviamente precisa de alguma melhoria!

#!/bin/bash
[ $# -ne 2 ] && echo -en "ERROR : Need 2 parameters.\n" && exit
[ -f $1 ] && cp $1 $2
if [ -d $1 ]  
then
    mkdir -p $2
    cd $1
    find . | while read fn
    do
        if [ -f $fn ] 
        then
            read -r -n1 yesorno
            if [ "$yesorno" == "y" ] || [ "$yesorno" == "Y" ]  
            then 
                mkdir -p $2/'dirname $fn'
                cp $fn $2/'dirname $fn'
            fi
        fi
    done
fi
    
por 27.04.2014 / 19:01
3

Em casos onde não quero pressionar y seguido por Enter , Eu copio ( Ctrl + Deslocamento + C na configuração do meu terminal) a y + nova linha uma vez de uma linha anterior, e depois colo ( Ctrl + Deslocamento + V ) sempre que solicitado.

Isso não é uma única chave, mas algo que eu posso pressionar de uma só vez, o que é bom o suficiente para mim. É possível manter pressionada a tecla Ctrl + Shift enquanto aguarda o próximo prompt.

    
por 27.04.2014 / 19:18
2

A solução mais robusta é armazenar a lista completa de arquivos em um arquivo, editá-la para deixar de fora aqueles que você não quer (tem a vantagem de permitir checar o resultado) e então fazer

cp 'cat /the/list/of/files' go/here
    
por 27.04.2014 / 20:14
1

Com base na invocação de read do Slyx, aqui está um simples one-liner:

{ while read -r -n1 i; do echo >&2; echo $i; done } | cp -iar …

Você terá que pressionar Ctrl + D no final para sair do loop. Até agora eu não encontrei magia de trabalho para sair do loop quando o comando é feito; trapping SIGCHLD parece não funcionar como eu esperava. Se você salvar isso em um arquivo chamado yesorno em seu caminho, você poderia escrever assim:

#!/bin/bash
{ while read -r -n1 i; do echo >&2; echo $i; done } | "$@"

Como uma alternativa, você poderia torná-la uma definição de função em ~/.bash_profile :

yesorno() {
  { while read -r -n1 i; do echo >&2; echo $i; done } | "$@"
}

Em ambos os casos, você pode invocá-lo assim:

yesorno cp -iar …
    
por 28.04.2014 / 08:40
1

Foi o que fiz quando precisei disso:

Crie um arquivo, por exemplo, "stdin.txt"

Escreva o conteúdo:

y

Depois de y, você digita duas novas linhas (Enter, Return, \ n) ... "y \ n \ n"

Em seguida, executo o comando: com "$ cmd < stdin.txt " como:

    
por 28.04.2014 / 17:56
-1

Se você simplesmente pressionar 'p' e depois digitar, ele responderá automaticamente 'y' para todas as perguntas restantes.

    
por 28.04.2014 / 15:47