Je déplace certains fichiers et je veux m'assurer que la commande mv
que j'ai tapée est correcte avant de l'exécuter.
Si j'utilisais apt-get
, je pourrais utiliser l'indicateur -s
pour effectuer une simulation qui ferait n'importe quoi.
mv
a-t-il une fonction similaire, qui simule le déplacement des fichiers mais ne fait rien?
Ce script devrait faire l'affaire. Il peut également gérer plusieurs fichiers/répertoires sources. Utilisez-le de la même façon que vous utiliseriez mv
- mvsim source... dest
. Notez qu'il ne fait pas attention aux options, qu'il ne les filtre pas (il les traite simplement comme des noms de fichiers) et qu'il risque de ne pas bien fonctionner avec les liens symboliques.
#!/bin/bash
if [ $# -lt 2 ]; then
echo "Too few arguments given; at least 2 arguments are needed."
exit 1
fi
lastArg="${@:$#}"
i=1
for param in "$@"; do
if [ ! -e "$param" -a $i -lt $# ]; then
echo "Error: $param does not exist."
exit 1
Elif [ "$param" = "$lastArg" -a $i -lt $# ]; then
echo "Error: $param is the same file/directory as the destination."
exit 1
fi
((i++))
done
if [ $# -eq 2 ]; then # special case for 2 arguments to make output look better
if [ -d "$1" ]; then
if [ -d "$2" ]; then
echo "Moves directory $1 (and anything inside it) into directory $2"
exit 0
Elif [ ! -e "$2" ]; then
echo "Renames directory $1 to $2"
exit 0
else
echo "Error: $2 is not a directory; mv cannot overwrite a non-directory with a directory."
exit 1
fi
else
if [ -d "$2" ]; then
echo "Moves file $1 into directory $2"
Elif [ -e "$2" ]; then
echo "Renames file $1 to $2, replacing file $2"
else
echo "Renames file $1 to $2"
fi
exit 0
fi
Elif [ ! -e "$lastArg" ]; then
echo "Error: $lastArg does not exist."
exit 1
Elif [ ! -d "$lastArg" ]; then
echo "Error: $lastArg is not a directory; mv cannot merge multiple files into one."
exit 1
fi
argsLeft=$#
echo "Moves..."
for param in "$@"; do
if [ $argsLeft -eq 1 ]; then
echo "...Into the directory $param" # has to be a directory because -f $lastArg was dealt with earlier
exit 0
fi
if [ -d "$param" ]; then
if [ ! -d "$lastArg" ]; then
echo "Error: $lastArg is not a directory; mv cannot overwrite a non-directory with a directory."
exit 1
fi
if [ $argsLeft -eq $# ]; then
echo "The directory ${param} (and anything inside it)..."
else
echo "And the directory ${param} (and anything inside it)..."
fi
else
if [ $argsLeft -eq $# ]; then
echo "The file ${param}..."
else
echo "And the file ${param}..."
fi
fi
((argsLeft--))
done
Quelques exemples:
$ ls
dir1 dir2 file1 file2 file3 mvsim
$ ./mvsim file1 file2
Renames file file1 to file2, replacing file file2
$ ./mvsim file1 newfile
Renames file file1 to newfile
$ ./mvsim file1 dir1
Moves file file1 into the directory dir1
$ ./mvsim file1 file2 file3 dir1
Moves...
The file file1...
And the file file2...
And the file file3...
...Into the directory dir1
$ ./mvsim file1 file2 dir1 dir2
Moves...
The file file1...
And the file file2...
And the directory dir1 (and anything inside it)...
...Into the directory dir2
$ ./mvsim file1 file2 file3 # error - file3 isn't a directory
Error: file3 is not a directory; mv cannot merge multiple files into one.
$ ./mvsim -f -i file1 dir1 # options aren't parsed or filtered out
Error: -f does not exist.
La fonction ci-dessous sert à vérifier verbalement la syntaxe de mv
. Notez que cela ne fonctionne que pour 2 arguments, SOURCE et DESTINATION, et ne vérifie pas l'indicateur -t
.
La fonction doit être placée dans ~/.bashrc
. Pour l'utiliser immédiatement, ouvrez un nouveau terminal ou exécutez source ~/.bashrc
mv_check()
{
# Function for checking syntax of mv command
# sort of verbose dry run
# NOTE !!! this doesn't support the -t flag
# maybe it will in future (?)
# check number of arguments
if [ $# -ne 2 ]; then
echo "<<< ERROR: must have 2 arguments , but $# given "
return 1
fi
# check if source item exist
if ! readlink -e "$1" > /dev/null
then
echo "<<< ERROR: " "$item" " doesn't exist"
return 1
fi
# check where file goes
if [ -d "$2" ]
then
echo "Moving " "$1" " into " "$2" " directory"
else
echo "Renaming " "$1" " to " "$2"
fi
}
Voici quelques essais:
$> mv_check TEST_FILE1 bin/python
Moving TEST_FILE1 into bin/python directory
$> mv_check TEST_FILE1 TEST_FILE2
Renaming TEST_FILE1 to TEST_FILE2
$> mv_check TEST_FILE1 TEST_FILE 2
<<< ERROR: must have 2 arguments , but 3 given
$> mv_check TEST_FILE1 TEST_FILE\ 2
Renaming TEST_FILE1 to TEST_FILE 2
$> mv_check TEST_FILE1 "TEST_FILE 2"
Renaming TEST_FILE1 to TEST_FILE 2
$> mv_check TEST_FILE1
<<< ERROR: must have 2 arguments , but 1 given
Il existe un programme sur github appelé peut-être qui peut être ce que vous recherchez.
Selon la description de leur projet, maybe
... vous permet d'exécuter une commande et de voir ce que cela fait à vos fichiers sans le faire! Après avoir examiné les opérations répertoriées, vous pouvez alors décider si vous voulez vraiment que ces choses se produisent ou non.
Ainsi, il vous montrera également ce que d’autres programmes feront à vos fichiers, pas seulement mv
.
maybe
a besoin de Python pour s'exécuter, mais cela ne devrait pas poser de problème. Il est facile de l’installer ou de le construire à l’aide du pip du gestionnaire de paquets de Python.
Le processus d'installation et l'utilisation du programme sont décrits sur la page d'accueil du projet. Malheureusement, je n'ai pas accès à un système Linux pour le moment, je ne peux donc pas vous donner d'exemples d'utilisation du programme.