Comment puis-je générer un nouveau nom pour un fichier s'il existe un fichier existant portant ce même nom? Dans un environnement de bureau, un nouveau nom est généré en ajoutant un numéro à la fin du nom de fichier, mais comment le faire à partir de la ligne de commande?
J'utilise le système d'exploitation Android avec Busybox.
mktemp
?mktemp
ne fonctionnera pas.Réponses:
En supposant que vous ayez un shell POSIX, vous pouvez le faire:
Comment l'utiliser
Il s'agit d'une fonction, alors enregistrez-la dans votre
~/.bashrc
et appelez-la comme vous le feriez normalementmv
.Qu'est-ce que cela fait
mv
exécutable d' origine dans laMV
variableDEST
DEST
existe et n'est pas un répertoire, cette fonction suppose que votre renommage essaie de clobber un fichier.
, qui marque l'extension), l'extension (quoi que ce soit après la finale.
), le nombre (le cas échéant; quoi que ce soit dans le préfixe après la finale-
).mv a.txt b.txt
elle essaiera d'abordmv a.txt b-001.txt
. Ce prochainmv
appel doit également être la fonction elle-même car s'ilb-001.txt
existe également, nous voulons continuer à incrémenter le compteur jusqu'à ce que nous trouvions un nouveau nom de fichier qui n'existe pas.mv
exécutable d' origine est appelé avec vos arguments d'origine.Avertissements
foo-001.txt
, il sera déplacé versfoo-001-001.txt
.Remarques
3
dans l'printf
instruction par ce que vous voulez.la source
/tmp
s'agit d'un répertoire existant et a appelé/bin/mv file1 /tmp
Je ne vois pas où est le problème.J'utilise généralement l'outil
mktemp
pour créer des fichiers temporaires fiables. Par défaut, il crée des fichiers, mais peut également créer des répertoires via son-d
commutateur.Exemple
Voici comment créer des noms temporaires de fichiers dans votre répertoire actuel.
Cela créera les fichiers pour vous.
Références
la source
mktemp
sur Android, mais +1 de ma part, car c'est une bonne réponse à une bonne question, U&L sage./system/bin/sh
et semble êtresh
compatible - des constructions comme leif [ -w $file ]
travail,mv
etrename
sont disponibles - donc un script pour faire cela juste avec des inserts devrait fonctionner là-bas.Voici une alternative au script de Joseph R qui n'a aucune mise en garde! Il ajoutera un suffixe numérique à un nom de chemin (le chemin peut être un répertoire ou un fichier), en incrémentant la valeur du suffixe jusqu'à ce qu'il en trouve un qui n'existe pas déjà. D'autres utilitaires tels que
logrotate
utilisent un modèle similaire, mais font pivoter toutes les copies existantes de sorte que le nouveau ait toujours «0» pour un suffixe. Puisque ce n'est pas une rotation dans ce sens, je l'appelleraidotmv
. N'oubliez pas que cefile.0
sera la plus ancienne copie.Par exemple:
Renomme
somefile.txt
somefile.txt.0
, sauf si ce dernier existe, auquel cas il le serasomefile.txt.1
, etc. Vous pouvez répertorier plusieurs fichiers (dotmv this that "the other thing"
etc.), ils seront tous déplacés par points.Je crois que c'est compatible POSIX - il fonctionne avec
set -o posix
bash (mais c'est un test douteux). J'ai également testé avec le shell Android (Jelly Bean 4.2.1), et cela fonctionne là-bas. Cependant, sur Android, vous devrez changer le shebang comme indiqué ou l'exécutersh dotmv
- ce que vous ferez de toute façon à moins que vous n'ayez un appareil enraciné, car il n'y a aucun moyen de rendre un script exécutable autrement. Changer le shebang vous permettra de l'utiliserexec dotmv
.Espérons que la logique ici est très simple. Cela pourrait être implémenté en python, C ou tout autre langage procédural complet avec des E / S de fichiers.
la source