Je suis très nouveau sur linux / ligne de commande et j'ai besoin de crypter les noms des fichiers 10K + (noms uniques) afin qu'ils correspondent au nom crypté MD5 dans la base de données mySQL.
J'ai vu comment vous pouvez renommer un répertoire de fichiers et comment obtenir le hachage d'un fichier ( mdsum? ) Mais je suis coincé sur la façon d'obtenir le hachage du nom de fichier, puis de renommer ce fichier en conservant le hachage généré l'extension ie
mynicepicture.jpg > fba8255e8e9ce687522455f3e1561e53.jpg
Il semble que ce devrait être un simple changement de nom ou de mv
ligne, mais je ne parviens pas à comprendre.
Merci beaucoup pour vos idées
PS J'ai vu l'utilisation des fonctions Perl dans quelques exemples proches de ce que je recherche mais je n'ai aucune idée où / comment les utiliser.
la source
fba8255e8e9ce687522455f3e1561e53
est le hachage MD5mynicepicture
, cela signifie-t-il que l'extension doit être supprimée avant le hachage?md5sum <<<"file name"
lefile name
fichier existant ou non, car il le considère comme une chaîne sauf le nourrir avec le nom des fichiers existants.Réponses:
Vous n'avez pas dit quel shell vous voulez utiliser, donc je suppose que Bash - la réponse a besoin d'ajustements pour fonctionner avec d'autres shells.
Version du script:
Cette
for
boucle simple prend chaque fichier dans le répertoire courant, calcule la somme md5 de son nom et le sort. Utilisez-le pour vérifier la fonctionnalité, si vous souhaitez commencer à renommer, remplacez le secondecho
parmv
.Explications
echo -n "$i" | md5sum
- calculer la somme md5 du nom de fichier complet, y compris l'extension de fichier ( tuyauterie ), pour supprimer le changement d'extensionecho -n "$i"
à l'un des éléments suivants:sum=$(…)
- exécuter…
et enregistrer la sortie dans$sum
( Substitution de commande )${sum%% *}
- afficher tout jusqu'au premier espace ( Substitution de paramètres ), le même que l'un des suivants:${i##*.}
- afficher tout après le dernier point (substitution de paramètres), le même que l'un des éléments suivants:Si vous devez renommer des fichiers récursivement dans différents dossiers, utilisez-les
find
avec l'-exec
option.la source
Ce
bash
script utilise l'md5sum
utilitaire de GNU coreutils pour calculer le hachage MD5 à partir du nom de base (sans extension) d'un nom de chemin donné. La fonction d'assistancemd5name
effectue le calcul réel et affichera le nouveau nom avec le chemin d'accès complet et l'extension.La
md5name
fonction utiliseawk
pour assembler le nouveau nom à partir des parties du nom de chemin donné et le résultat demd5sum
.Exemples de la fonction utilisée par elle-même:
... où
c9e89fa443d16da4b96ea858881320c9
est le hachage MD5 de la chaînefile name here
.Supprimez le
echo
du script en haut pour renommer les fichiers. Vous voudrez peut-être enregistrer la sortie du script d'origine dans un fichier (avec leecho
en place) si vous avez besoin à un moment donné de restaurer les noms de fichier à leurs originaux.Notez que l'exécuter deux fois sur un ensemble de fichiers calculera le hachage MD5 des hachages MD5, et que le nom de fichier d'origine devient alors irrécupérable à moins que vous ne preniez soigneusement note des fichiers appelés après chaque exécution du script.
la source
awk
partie pourrait être remplacée parwhile read sum dummy ; do printf "%s/%s.%s\n' $dir $sum $ext ; done ;
Vous avez besoin dedummy
pour capturer le «-».awk
m'amuse et il m'a fallu un certain temps pour utiliser lesbash
utilitaires plutôt quesystem()
dansawk
Avec
perl
« srename
:(retirer
-n
quand heureux).la source
Pour une
AWK
approche:Les
find
commandes modernes ne nécessitent pas de répertoire pour la saisie.
est supposée, donc le [Répertoire] pourrait être laissé vide. Le-type f
seul trouve des fichiers, ce qui est pratique car ilmd5sum
n'aime pas les répertoires et changer le nom du répertoire pendant l'exécution ne serait pas une bonne idée. À utiliser-iname pattern
si vous ne souhaitez utiliser que certains fichiers, par exemple-iname \*.dat
, si la casse est importante, utilisez à la-name
place de-iname
.Les
match(...); sub(...)
morceaux extraient des parties du nom de fichier et les remplacent dans la chaîne d'entrée. Notez que"^"
et"$"
sont [pre / ap] en attente pour éviter de remplacer une chaîne qui peut répéter le chemin / l'extension.Remplacez
print(com)
parsystem(com)
pour effectuer le changement de nom.Si vous voulez utiliser le nom
md5sum
du fichier réel comme nom, vous pouvez utiliser le fait quemd5sum
la somme et le nom de fichier d'entrée sont sortis pour faire quelque chose comme:Le
while read sum file
prendra 2 arguments, les résultats de lamd5sum
commande, et affecterasum
et lesfile
variables avec eux. Étant donné que lesum
ne devrait pas contenir d'espace, leread
devrait fonctionner correctement.Évidemment, le
[echo]
devrait être supprimé lors de l'exécution, mais c'est toujours une bonne idée lors du test de toute modification de script pour tester la recherche avant de l'exécuter.Tout cela suppose que vous courez
bash
. En outre, cela peut être tapé comme une longue ligne:la source
C'est une approche que j'aime souvent utiliser.
La commande "ls" produit un flux de lignes de texte. La commande "sed" transforme chaque ligne avec des règles de correspondance de motifs. La commande "sed" génère une commande "mv" qui est ensuite envoyée via un shell "sh" pour exécution. Les paramètres de la commande "mv" sont comme "mv oldfilename newfilename", qui renomme le fichier. Je construis le nouveau nom de fichier avec une commande sed qui prend la partie avant le dernier point, et l'écho dans l'entrée de la commande "md5sum", puis prend juste le hachage de sa sortie.
En parcourant mon processus, commencez par lister les fichiers ('head -n 3' pour ne voir que les 3 premières lignes):
Pensez ensuite à transformer avec sed (pas encore de piping de commandes générées via un shell)
Il existe trois modèles de correspondance:
Je veux utiliser sed pour remplacer un nom de fichier d'entrée par "mv filename NEWfilename", mais comme je passe des commandes via un shell, je peux générer des commandes qui obtiennent le md5sum, comme ceci
pour obtenir juste le hachage
Dans un shell Unix, nous pouvons utiliser des opérateurs de backtick (`some_command`) pour exécuter une sous-commande, donc par exemple
De retour à la commande mv, je veux que sed produise "mv here there" avec "there" remplacé par une commande backtick pour obtenir le md5sum. La chaîne à l'intérieur de la chaîne de remplacement sed commence comme ceci
Mais fait clairement le même hachage pour chaque nom de fichier, car la commande backticked est exécutée avant que sed ne voie la chaîne. Pour arrêter le shell exécutant la commande backtick afin que sed produise les backticks, nous devons ajouter des barres obliques (également au caractère pipe), encore une fois:
La sortie a également besoin que les noms de fichiers soient cités en cas d'espaces, donc
Essayons donc celui-ci, en le passant à travers un shell:
Cela a-t-il fonctionné? j'imagine:
Voici une approche de recoupement; utilisez "ls" option "-i" pour sortir le i-node du système de fichiers unix (qui ne change pas avec "mv"):
Ou, en utilisant la commande "coller" (package 'coreutils')
la source
J'aime cette réponse d'une ligne, mais elle se casse car elle analyse le nom de fichier. Je l'ai également un peu augmenté avec des hachages de sha.
Je pense que cela extrait également les fichiers et les place à la base de la saisie de la commande.
Merci.
la source