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

9

Supposons que j'ai un dossier contenant certains fichiers et certains dossiers (les fichiers peuvent être de tout type). Et je veux déplacer / copier certains de ces fichiers et dossiers à l'aide de la commande mv/ cp. Existe-t-il un moyen, tel que je pourrais en sélectionner certains au hasard, tout comme nous faisons la sélection à l'aide de la touche Ctrl, et déplaçons / copions à l'aide du terminal? Je ne peux utiliser ni caractère générique, ni l'expression régulière, car je souhaite sélectionner des fichiers de différents types, et leurs noms ont peu de similitudes.

MikhilMC
la source
3
Vous voudrez peut-être fournir plus d'informations. Quel type de fichiers de similitude ont?
Sergiy Kolodyazhnyy
2
Même si vous ne pouvez pas utiliser d'expressions régulières ou de caractères génériques, vous pouvez peut-être profiter de la similitude et des accolades pour développer les arguments. En bash de toute façon si vous avez fichier1, fichier2, fichier3 comme dans l'une des réponses ci-dessous, vous pouvez simplement utiliser cp -t /dest/ file{1,2,3}ou pour les plages cp -t /dest/ file{1..3}. Il fonctionne également pour les arguments et les combinaisons non numériques, par exemple les cp -t /dest/ f{ile,ly}.{csv,txt}exécutions cp -t /dest/ file.txt file.csv fly.txt fly.csv. Soyez prudent avec l'écrasement des choses si la position est importante, mais je les trouve utiles.
neocpp
Pourquoi en avez-vous besoin? Pourquoi ne pas utiliser le gestionnaire de fichiers comme vous le décrivez? Les outils shell essaient d'être le moins ambigus possible.
Braiam
Nous savons tous que nous pouvons sélectionner des fichiers et des dossiers aléatoires sous un dossier à l'aide de la touche Ctrl. Je veux juste savoir si nous pouvons implémenter une technique similaire lors de l'utilisation du terminal Linux
MikhilMC

Réponses:

11

Si vous souhaitez déplacer ou copier tous les fichiers dans le même répertoire, vous pouvez utiliser l' -toption de cpou mv, mais cela signifie que vous devez saisir / fournir chaque nom de fichier comme argument. Il fonctionne de la manière suivante, avec autant de fichiers que 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 la saisie des noms de fichiers peut être facilitée en utilisant la complétion des onglets de Bash .

Alternativement, le script bash suivant trouvera tous les fichiers dans un répertoire, donné comme premier argument, et copiera les fichiers sélectionnés dans le répertoire de destination, donné comme second argument.

Il vérifie chaque fichier et vous demande si vous souhaitez copier ce fichier. À la fin de la sélection des fichiers, 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 ce script pour savoir si le répertoire de destination existe, ou que vous avez entré les bons arguments.

Arronical
la source
4

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 sauts de ligne 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 deuxième et le nombre de fichiers / répertoires (le script ne fait pas de différence entre les fichiers et les répertoires, comme vous l’avez demandé) à copier. Par exemple, pour copier 5 fichiers ou répertoires aléatoires de /foovers /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 avec le même nom de fichier dans le répertoire cible.

terdon
la source
0

Essayez peut-être d'utiliser quelque chose comme Midnight Commander ? Il s'agit d'une application console qui fournit des fonctionnalités similaires au gestionnaire de fichiers graphique Nautilus.

À M
la source
0

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

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

Tapez ensuite Ctrl + C. Cela fonctionnera à coup sûr. Je l'ai testé. Par cette méthode, nous pouvons sélectionner des fichiers tout comme en utilisant le Ctrlbouton en mode graphique, et copier / déplacer / supprimer.

MikhilMC
la source