copiar / mover múltiples archivos usando cp / mv sin usar expresiones regulares

9

Supongamos que tengo una carpeta que contiene algunos archivos y algunas carpetas (los archivos pueden ser de cualquier tipo). Y quiero mover / copiar algunos de esos archivos y carpetas usando mv/ cpcommand. ¿Hay alguna forma de que pueda seleccionar algunos de ellos al azar, tal como hacemos la selección con la tecla Ctrl y mover / copiar usando la terminal? No puedo usar comodines ni la expresión regular, ya que quiero seleccionar archivos de diferentes tipos, y sus nombres tienen una pequeña cantidad de similitudes.

MikhilMC
fuente
3
Es posible que desee proporcionar más información. ¿Qué tipo de archivos de similitud tienen?
Sergiy Kolodyazhnyy
2
Incluso si no puede usar expresiones regulares o comodines, tal vez pueda aprovechar la similitud y las llaves para expandir los argumentos. En bash de todos modos, si tiene file1, file2, file3 como en una de las respuestas a continuación, puede usar cp -t /dest/ file{1,2,3}o para rangos cp -t /dest/ file{1..3}. Funciona también para argumentos no numéricos y combinaciones, por ejemplo, se cp -t /dest/ f{ile,ly}.{csv,txt}ejecuta cp -t /dest/ file.txt file.csv fly.txt fly.csv. Tenga cuidado al sobrescribir las cosas si la posición es importante, pero las encuentro útiles.
neocpp
¿Por qué necesitas esto? ¿Por qué no usar el administrador de archivos como usted describe? Las herramientas de shell intentan ser lo menos ambiguas posible.
Braiam
Todos sabemos que podemos seleccionar archivos y carpetas al azar en una carpeta usando la tecla Ctrl. Solo quiero saber si podemos implementar una técnica similar mientras usamos un terminal Linux
MikhilMC

Respuestas:

11

Si desea mover o copiar todos los archivos al mismo directorio, puede usar la -topción de cpo mv, pero esto significará que debe escribir / suministrar cada nombre de archivo como argumento. Funciona de la siguiente manera, con tantos archivos como argumentos desee:

cp -t /destination/directory/ file1 file2 file3

o

mv -t /destination/directory/ file1 file2 file3

Esto es bastante laborioso, pero escribir los nombres de los archivos puede ser más fácil usando la finalización de pestañas de Bash .

Alternativamente, el siguiente script bash encontrará todos los archivos en un directorio, dado como el primer argumento, y copiará los archivos seleccionados en el directorio de destino, dado como el segundo argumento.

Comprueba cada archivo y le pregunta si desea copiar ese archivo. Al final de la selección de archivos, muestra una lista de los archivos seleccionados y le pregunta si desea copiarlos en el directorio 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[@]}"

Tenga en cuenta que no hay errores al verificar en este script si el directorio de destino existe o si ha ingresado los argumentos correctos.

Arronico
fuente
4

Aquí hay un script que selecciona un conjunto aleatorio de archivos / directorios para copiar. Puede tratar con nombres de archivos arbitrarios, incluso aquellos que contienen líneas nuevas y espacios. Guarde el script como ~/bin/randomCopy.sh, hágalo ejecutable ( chmod a+x ~/bin/randomCopy.sh) y luego ejecútelo, dándole el directorio de origen como primer argumento, el directorio de destino como el segundo y la cantidad de archivos / directorios (el script no diferencia entre archivos y directorios, como solicitó) para ser copiado. Por ejemplo, para copiar 5 archivos o directorios aleatorios de /fooa /bar:

randomCopy.sh /foo /bar 5

La secuencia de comandos:

#!/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

Tenga en cuenta que esto sobrescribirá los archivos existentes si existe alguno con el mismo nombre de archivo en el directorio de destino.

terdon
fuente
0

Tal vez intente usar algo como Midnight Commander ? Es una aplicación de consola que proporciona características similares al administrador de archivos gráfico Nautilus.

Tom
fuente
0

Recientemente descubrí una solución efectiva para este problema usando xargs.

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

Luego escribe Ctrl + C. Esto funcionará seguro. Lo he probado Mediante este método podemos seleccionar archivos al igual que usar el Ctrlbotón en el modo de gráficos, y copiar / mover / eliminar.

MikhilMC
fuente