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 mv
name __/cp
name__. 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.
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.
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.
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.
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.