web-dev-qa-db-fra.com

copier / déplacer plusieurs fichiers en utilisant cp / mv sans utiliser d'expressions régulières

Supposons que j'ai un dossier contenant des fichiers et des dossiers (les fichiers peuvent être de tout type). Et je veux déplacer/copier certains de ces fichiers et dossiers en utilisant la commande mvname __/cpname__. Existe-t-il un moyen, tel que je puisse en sélectionner certains de manière aléatoire, comme nous le faisons avec la touche Ctrl, et de déplacer/copier avec un terminal? Je ne peux utiliser ni le caractère générique, ni l'expression régulière, car je souhaite sélectionner des fichiers de types différents, et leurs noms présentent peu de similitudes.

8
MikhilMC

Si vous souhaitez déplacer ou copier tous les fichiers dans le même répertoire, vous pouvez utiliser l'option -t de cp ou mv, mais cela signifie que vous devez taper/fournir chaque nom de fichier en tant qu'argument. Cela fonctionne de la manière suivante, avec autant de fichiers d'arguments que vous le souhaitez:

cp -t /destination/directory/ file1 file2 file3

ou

mv -t /destination/directory/ file1 file2 file3

C'est assez laborieux, mais taper les noms de fichiers peut être rendu plus facile en utilisant complétion de l'onglet de Bash .

Alternativement, le script bash suivant trouvera tous les fichiers d'un répertoire (premier argument) et copiera les fichiers sélectionnés dans le répertoire de destination (deuxième argument).

Il vérifie chaque fichier et vous demande si vous souhaitez copier ce fichier. À la fin de la sélection de fichier, il affiche une liste des fichiers sélectionnés et vous demande si vous souhaitez les copier dans le répertoire de destination:

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

Soyez averti qu'il n'y a pas d'erreur dans la vérification de ce script indiquant si le répertoire de destination existe ou si vous avez entré les arguments corrects.

10
Arronical

Voici un script qui sélectionne un ensemble aléatoire de fichiers/répertoires à copier. Il peut traiter des noms de fichiers arbitraires, même ceux contenant des nouvelles lignes et des espaces. Enregistrez le script sous ~/bin/randomCopy.sh, rendez-le exécutable (chmod a+x ~/bin/randomCopy.sh), puis exécutez-le en lui donnant le répertoire source comme premier argument, le répertoire cible comme second et le nombre de fichiers/répertoires (le script ne différencie pas les fichiers). répertoires, comme vous l'avez demandé) à copier. Par exemple, pour copier 5 fichiers ou répertoires aléatoires de /foo à /bar:

randomCopy.sh /foo /bar 5

Le scénario:

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

Notez que cela écrasera les fichiers existants s'il en existe dans le répertoire cible des fichiers portant le même nom.

4
terdon

Peut-être essayez-vous d'utiliser quelque chose comme Midnight Commander ? Il s’agit d’une application console offrant des fonctionnalités similaires à celles du gestionnaire de fichiers graphique Nautilus.

0
Tom

Récemment, j'ai trouvé une solution efficace à ce problème en utilisant xargs.

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

Puis tapez Ctrl + C. Cela fonctionnera à coup sûr. Je l'ai testé. Avec cette méthode, nous pouvons sélectionner des fichiers comme si vous utilisiez le bouton Ctrl en mode graphique, puis copier/déplacer/supprimer.

0
MikhilMC