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.