copiar / mover vários arquivos usando cp / mv sem usar expressões regulares

9

Suponha que eu tenha uma pasta contendo alguns arquivos e algumas pastas (os arquivos podem ser de qualquer tipo). E eu quero mover / copiar alguns desses arquivos e pastas usando mv/ cpcommand. Existe alguma maneira, de modo que eu possa selecionar alguns deles aleatoriamente, assim como fazemos a seleção usando a tecla Ctrl e mover / copiar usando o terminal? Não posso usar nem curinga, nem a expressão regular, pois quero selecionar arquivos de tipos diferentes, e seus nomes têm poucas semelhanças.

MikhilMC
fonte
3
Você pode querer fornecer mais informações. Que tipo de arquivos de similaridade tem?
Sergiy Kolodyazhnyy
2
Mesmo que você não possa usar expressões regulares ou curingas, talvez possa tirar proveito da similaridade e chaves para expandir argumentos. De qualquer forma, no bash, se você tiver arquivo1, arquivo2, arquivo3, como em uma das respostas abaixo, basta usar cp -t /dest/ file{1,2,3}ou para intervalos cp -t /dest/ file{1..3}. Também funciona para argumentos e combinações não numéricos, por exemplo, cp -t /dest/ f{ile,ly}.{csv,txt}executa cp -t /dest/ file.txt file.csv fly.txt fly.csv. Tenha cuidado ao substituir as coisas se a posição for importante, mas as acho úteis.
Neocpp
Por que você precisa disso? Por que não usar o gerenciador de arquivos como você descreve? As ferramentas de shell tentam ser as menos ambíguas possível.
Braiam
Todos sabemos que podemos selecionar arquivos e pastas aleatórios em uma pasta usando a tecla Ctrl. Eu só quero saber se podemos implementar uma técnica semelhante ao usar o terminal Linux
MikhilMC

Respostas:

11

Se você deseja mover ou copiar todos os arquivos para o mesmo diretório, pode usar a -topção cpor mv, mas isso significa que você deve digitar / fornecer cada nome de arquivo como argumento. Funciona da seguinte maneira, com tantos arquivos quantos argumentos você desejar:

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 com a conclusão da guia do Bash .

Como alternativa, o script bash a seguir encontrará todos os arquivos em um diretório, fornecido como o primeiro argumento, e copiará os arquivos selecionados no diretório de destino, como o segundo argumento.

Ele verifica cada arquivo e pergunta se você deseja copiar esse arquivo. No final da seleção de arquivos, ele mostra uma lista dos 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 de que não há erro ao verificar neste script se o diretório de destino existe ou se você inseriu os argumentos corretos.

Arronical
fonte
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 que contêm 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, fornecendo-lhe o diretório de origem como o primeiro argumento, o diretório de destino como o segundo e o número de arquivos / diretórios (o script não diferencia os arquivos e diretórios, conforme solicitado) para ser copiado. Por exemplo, para copiar 5 arquivos ou diretórios aleatórios de /foopara /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 no diretório de destino.

Terdon
fonte
0

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

Tom
fonte
0

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

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

Então digite Ctrl + C. Isso funcionará com certeza. Eu testei. Por esse método, podemos selecionar arquivos da mesma forma que o Ctrlbotão no modo gráfico, e copiar / mover / remover.

MikhilMC
fonte