copy / move vários arquivos usando cp / mv sem usar expressões regulares

8

Suponha que eu tenha uma pasta contendo alguns arquivos e algumas pastas (arquivos podem ser de qualquer tipo). E eu quero mover / copiar alguns desses arquivos e pastas usando o comando mv / cp . Existe alguma maneira, tal que eu poderia selecionar alguns deles aleatoriamente, assim como fazemos a seleção usando a tecla Ctrl, e fazer mover / copiar usando o terminal? Eu não posso usar nenhum curinga, nem a expressão regular, como eu quero selecionar arquivos de diferentes tipos, e seus nomes têm pequena quantidade de semelhanças.

    
por MikhilMC 20.07.2016 / 11:23

4 respostas

9

Se você quiser mover ou copiar todos os arquivos para o mesmo diretório, poderá usar a opção -t de cp ou mv , mas isso significará que você precisa digitar / fornecer cada nome de arquivo como um argumento. Funciona da seguinte maneira, com tantos arquivos quanto argumentos:

cp -t /destination/directory/ file1 file2 file3

ou

mv -t /destination/directory/ file1 file2 file3

Isso é bastante trabalhoso, mas a digitação dos nomes dos arquivos pode ser facilitada usando conclusão da guia do Bash .

Como alternativa, o seguinte script bash encontrará todos os arquivos em um diretório, dado como o primeiro argumento, e copiará os arquivos selecionados para o diretório de destino, dado como segundo argumento.

Ele verifica cada arquivo e pergunta se você deseja copiar esse arquivo. No final da seleção do arquivo, ele mostra uma lista de arquivos selecionados e pergunta se você deseja copiá-los para o diretório de destino:

#!/bin/bash
directory=$1
destination=$2
selected_files=()
for f in ${directory}/*
do
  if [[ -f $f ]]
  then
    while true
    do
      read -p "Would you like to copy ${f}? y/n: " choice
      case $choice in
        y|Y) selected_files+=("$f");
             break ;;
        n|N) echo "${f} will not be copied.";
             break ;;
        *) echo "Invalid choice, enter y/n: " ;;
      esac
    done
  fi
done
echo "The following files will be copied to ${destination}."
for file in "${selected_files[@]}"
do
  echo "$file"
done
while true
do
  read -p "Are these the correct files? y/n: " confirm
  case $confirm in
    y|Y) break ;;
    n|N) echo "Exiting filechooser"; exit 1 ;;
    *) echo "Invalid choice, enter y/n: " ;;
  esac
done
cp -t "$destination" "${selected_files[@]}"

Esteja avisado que não há verificação de erros neste script sobre se o diretório de destino existe ou se você inseriu os argumentos corretos.

    
por Arronical 20.07.2016 / 11:42
4

Aqui está um script que seleciona um conjunto aleatório de arquivos / diretórios a serem copiados. Ele pode lidar com nomes de arquivos arbitrários, mesmo aqueles contendo novas linhas e espaços. Salve o script como ~/bin/randomCopy.sh , torne-o executável ( chmod a+x ~/bin/randomCopy.sh ) e execute-o, dando-lhe o diretório de origem como primeiro argumento, o diretório de destino como o segundo e o número de arquivos / dirs (o script não diferenciar entre arquivos e diretórios, conforme solicitado) para serem copiados. Por exemplo, para copiar 5 arquivos ou diretórios aleatórios de /foo para /bar :

randomCopy.sh /foo /bar 5

O script:

#!/bin/bash

if [ $# -lt 3 ]; then
        cat<<EOF 
This script needs at least 3 arguments: the source directory, the
target directory and the number of files/dirs to be copied. For example:

    $0 /from /to 5

EOF
        exit
fi 

sourceDir="$1"
targetDir="$2"
number="$3"

## Collect all file and directory names. The globstar
## bash option lets ** match all files and directories
## recursively
shopt -s globstar
dirsAndFiles=( ** )

## Get $num random numbers from 0 until
## the number of files and dirs found. This
## will let us take a random selection.
limit=$((${#dirsAndFiles[@]}-1))  
numbers=$(shuf -i 0-"$limit" -n "$number")

for num in $numbers; do
    cp -rv "${dirsAndFiles[$num]}" "$targetDir"
done

Observe que isso substituirá os arquivos existentes, se houver algum com o mesmo nome de arquivo no diretório de destino.

    
por terdon 20.07.2016 / 16:41
0

Talvez tente usar algo como Midnight Commander ? É um aplicativo de console que fornece recursos semelhantes ao Gerenciador de Arquivos Nautilus gráfico.

    
por Tom 27.07.2016 / 04:52
0

Recentemente, descobri uma solução eficaz para esse problema usando xargs.

'xargs cp
 file1
 file2
 .....
 .....
 <path of the destination folder>'

Em seguida, digite Ctrl + C . Isso funcionará com certeza. Eu testei isso. Por esse método, podemos selecionar arquivos como o botão Ctrl no modo gráfico e copiar / mover / remover.

    
por MikhilMC 10.08.2016 / 11:59