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.


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.


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.


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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.