copia / sposta più file usando cp / mv senza usare espressioni regolari


9

Supponiamo di avere una cartella contenente alcuni file e alcune cartelle (i file possono essere di qualsiasi tipo). E voglio spostare / copiare alcuni di quei file e cartelle usando il comando mv/ cp. Esiste un modo, tale che potrei selezionarne alcuni in modo casuale, proprio come facciamo la selezione usando il tasto Ctrl, e spostiamo / copiamo usando il terminale? Non posso usare né caratteri jolly né espressioni regolari, in quanto desidero selezionare file di tipi diversi e i loro nomi presentano piccole somiglianze.


3
Potresti voler fornire maggiori informazioni. Che tipo di file di somiglianza hanno?
— Sergiy Kolodyazhnyy il

2
Anche se non puoi usare espressioni regolari o caratteri jolly, puoi forse sfruttare la somiglianza e le parentesi graffe per espandere gli argomenti. In bash comunque se hai file1, file2, file3 come in una delle risposte di seguito, puoi semplicemente usare cp -t /dest/ file{1,2,3}o per intervalli cp -t /dest/ file{1..3}. Funziona anche per argomenti e combinazioni non numerici, ad es . cp -t /dest/ f{ile,ly}.{csv,txt}Esegue cp -t /dest/ file.txt file.csv fly.txt fly.csv. Fai attenzione a sovrascrivere le cose se la posizione è importante, ma le trovo utili.
— Neocpp,

Perchè ti serve? Perché non usare il file manager come descrivi? Gli strumenti della shell cercano di essere il meno ambiguo possibile.
— Braiam,

Sappiamo tutti che possiamo selezionare file e cartelle casuali in una cartella usando il tasto Ctrl. Voglio solo sapere se possiamo implementare una tecnica simile usando il terminale Linux
— MikhilMC

Risposte:


11

Se si desidera spostare o copiare tutti i file nella stessa directory, è possibile utilizzare l' -topzione di cpo mv, ma ciò significa che è necessario digitare / fornire ciascun nome file come argomento. Funziona nel modo seguente, con tutti i file quanti argomenti desideri:

cp -t /destination/directory/ file1 file2 file3

o

mv -t /destination/directory/ file1 file2 file3

Questo è abbastanza laborioso, ma digitare i nomi dei file può essere semplificato usando il completamento della scheda di Bash .

In alternativa, il seguente script bash troverà tutti i file in una directory, forniti come primo argomento, e copia i file selezionati nella directory di destinazione, dati come secondo argomento.

Controlla ogni file e chiede se si desidera copiare quel file. Alla fine della selezione dei file mostra un elenco di file selezionati e chiede se si desidera copiarli nella directory di destinazione:

#!/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[@]}"

Tieni presente che in questo script non è presente alcun errore per verificare se esiste la directory di destinazione o se hai inserito gli argomenti corretti.


4

Ecco uno script che seleziona un set casuale di file / directory da copiare. Può gestire nomi di file arbitrari, anche quelli che contengono newline e spazi. Salvare lo script come ~/bin/randomCopy.sh, renderlo eseguibile ( chmod a+x ~/bin/randomCopy.sh) e quindi eseguirlo, assegnandogli la directory di origine come primo argomento, la directory di destinazione come secondo e il numero di file / directory (lo script non fa distinzione tra file e directory, come da lei richiesto) da copiare. Ad esempio, per copiare 5 file o directory casuali da /fooa /bar:

randomCopy.sh /foo /bar 5

Il copione:

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

Si noti che ciò sovrascriverà i file esistenti se ne esiste uno con lo stesso nome nella directory di destinazione.


0

Forse prova a usare qualcosa come Midnight Commander ? Si tratta di un'applicazione console che offre funzionalità simili al File Manager grafico Nautilus.


0

Recentemente ho scoperto una soluzione efficace per questo problema usando xargs.

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

Quindi digitare Ctrl + C. Questo funzionerà di sicuro. L'ho provato. Con questo metodo possiamo selezionare i file proprio come usando il Ctrlpulsante in modalità grafica, e fare copia / spostare / rimuovere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.