-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDictionnaire Linux.txt
373 lines (323 loc) · 22.7 KB
/
Dictionnaire Linux.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
Passer en mode console : Ctrl + Alt + F6
Retour en mode graphique : Ctrl + Alt + F7
~ : dossier /home/utilisateur
/ : racine
Niveau d'utilisation
$ : utilisateur normal
# : superutilisateur (root)
Combinaison des paramètres courts : commande -d -a -U -h est équivalent à commande -daUh
Syntaxe paramètres longs : commande --parametre1 --parametre2 ...
Passer des valeurs aux paramètres :
Pour paramètres courts : commande -p 14
Pour paramètres longs : commande --parametre=14
Autocomplétion : on peut écrire le début d'une commande puis taper 2 fois tab pour que la console nous donne les commandes commençant par ce qu'on a écrit
Historique des commandes tapées : history
rechercher une commande tapée : Ctrl + R // écrire un mot contenu dans la commande tappée, passer a la détection suivante en appuyant de nouveau sur Ctrl + R
effacer le contenu de la console : Ctrl + L
fermer la console : exit ou Ctrl + D
ramener le curseur au début de la commande : Ctrl + A
ramener le curseur à la fin de la commande : Ctrl + E
supprimer tout ce qui se trouve à gauche du curseur : Ctrl + U
supprimer tout ce qui se trouve à droite du curseur : Ctrl + K
supprime le premier mot situé à gauche du curseur : Ctrl + W
Coller le dernier texte supprimé avec les commandes en haut : Ctrl + Y
Arrêter une commande : Ctrl + C
______________________________
Dosiers dans la racine
------------------------------
bin : contient des programmes (exécutables) susceptibles d'être utilisés par tous les utilisateurs de la machine.
boot : fichiers permettant le démarrage de Linux.
dev : fichiers contenant les périphériques. On y retrouve ainsi par exemple le fichier qui représente le lecteur CD.
etc : fichiers de configuration.
home : répertoires personnels des utilisateurs. c'est dans ce dossier que vous placerez vos fichiers personnels, à la manière du dossier Mes documents de Windows.
lib : dossier contenant les bibliothèques partagées (généralement des fichiers.so) utilisées par les programmes. C'est en fait là qu'on trouve l'équivalent des .dll de Windows.
media : lorsqu'un périphérique amovible est inséré dans votre ordinateur, Linux vous permet d'y accéder à partir d'un sous-dossier de media. On parle de montage.
mnt : c'est un peu pareil que media, mais pour un usage plus temporaire.
opt : répertoire utilisé pour les add-ons de programmes.
proc : contient des informations système.
root : c'est le dossier personnel de l'utilisateur « root ».
sbin : contient des programmes système importants.
tmp : dossier temporaire utilisé par les programmes pour stocker des fichiers.
usr : c'est un des plus gros dossiers, dans lequel vont s'installer la plupart des programmes demandés par l'utilisateur.
var : ce dossier contient des données « variables », souvent des logs (traces écrites de ce qui s'est passé récemment sur l'ordinateur).
trou noir du système : /dev/null //Tout ce qui est envoyé là-dedans est immédiatement supprimé
Couleurs:
bleu : dossiers
bleu clair : raccourci
blanc/noir : fichiers
______________________________
Commandes de base
------------------------------
afficher le dossier actuel : pwd
connaître l'emplacement d'une commande : which commande //permet de localiser la position du programme correspondant à une commande.
lister contenu du répertoire : ls
[-a : affiche dossiers/fichiers cachés]
[cheminRépertoire : utilise ce répertoire au lieu du répertoire courant]
[-F : indique le type d'élément]
[-l : liste détaillée] //colonnes : 1. droits, 2. nb de liens physiques, 3. nom du propriétaire, 4. groupe du propriétaire, 5. taille en octets, 6. date de modification, 7. nom
[-h : lisible par un humain] //affiche la taille en Ko, Mo, Go ...
[-t : trier par date de dernière modification]
[-r : inverser l'ordre de tri]
changer de dossier : cd [chemin (défaut à ~)] //autocomplete avec tab après avoir tapé le début du chemin
obtenir taille occupée par le dossier actuel : du [-h : lisible par un humain] [-a : dossiers ET fichiers] [-s : avoir juste le grand total]
afficher tout le contenu d'un fichier : cat chemin [-n : afficher les numéros des lignes]
afficher le fichier par parties : less chemin //Appuyer sur Espace pour avancer d'une page, sur Enter pour une ligne, b retour d'une page, y retour d'une ligne, q sortir
afficher le début d'un fichier : head -n nombreDeLignes chemin
afficher la fin d'un fichier : tail -n nombreDeLignes chemin // il y a aussi -f qui permet de « suivre » la fin du fichier au fur et à mesure de son évolution.
créer un fichier : touch nomfichier // on peut créer plusieurs fichiers à la fois : ex : touch nomfichier1 nomfichier2 ...
créer un dossier : mkdir nomDossier // pour création profonde : mkdir -p animaux/vertebres/chat //peut aussi créer plusieurs dossiers comme la syntaxe de touch
copier un fichier : cp nomFichier nomCopie // Copier dans un autre dossier : cp fichierbidon mondossier/ (copie fichierbidon avec le même nom dans mondossier)
copier des dossiers : cp -r cheminDossierACopier cheminDestination
copier avec joker (wildcard): ex : cp *.jpg mondossier/ //copie tout les .jpg dans mondossier. autre exemple : cp so* mondossier/ //copie tout les fichier commençant pas so
déplacer un fichier/dossier : mv cheminFichierOuDossier cheminDestinationFichierOuDossier //ex avec joker : mv *.jpg mondossier/
renommer un fichier/dossier : mv cheminFichierOuDossier cheminFichierOuDossierAvecNouveauNom
supprimer un fichier : rm cheminFichierOuDossier //on peut mettre plusieurs fichiers/dossiers pour supprimer en même temps
[-i : demander confirmation]
[-f : forcer la suppression]
[-v : afficher les opérations produites]
[-r : supprimer un dossier et son contenu]
vérifier droits dans un répertoire : ls -l [*.type]
exécuter une commande en root : sudo commande
passer en root pour la session actuelle : sudo su - //taper exit quand on a terminé
ajouter un utilisateur : adduser nomUtilisateur //n'existe que pour debian et ses descendant, ailleurs, on doit utiliser useradd
changer le mot de passe : passwd nomUtilisateur
supprimer un compte : deluser [--remove-home] nomUtilisateur // --remove-home enlève les dossiers personnels //n'existe que pour debian et ses descendant, ailleurs, on doit utiliser userdel
créer un groupe : addgroup nomGroupe
renommer un utilisateur : usermod -g nomUtilisateur nouveauNomUtilisateur
changer les groupe d'un utilisateur : usermod -G ...groupes nomUtilisateur
ajouter des groupes à un utilisateur : usermod -aG ...groupes nomUtilisateur
supprimer un groupe : delgroup nomGroupe
changer le propriétaire d'un fichier : chown nomUtilisateur nomFichier
changer le groupe propriétaire d'un fichier : chgrp nomGroupe nomFichier
changer le groupe propriétaire du contenu d'un dossier : chgrp -R nomGroupe cheminDossier
colonne droits : [d(dossier) ou l(lien) ou -(autre)] [droits propriétaire] [droits groupe du propriétaire] [droits autres utilisateurs]
valeurs droits : r:4 w:2 x:1 //donc pour autoriser la lecture et l'execution : 4 + 1 = 5
changer les droits sur un fichier : chmod 600 nomFichier //il faut être le root ou le propriétaire
changer les droits sur le contenu d'un répertoire : chmod -R 731 chemin
créer un lien physique : ln nomFichier nomLienFichier //dans un lien physique, le lien pointe vers le contenu du fichier
créer des liens symboliques : ln -s nomFichier nomLienFichier //un lien symbolique pointe vers le fichier (qui pointe vers son contenu) //ressemble aux raccourcis de windows
recherche rapide : locate nomFichierOuDossier //peut être une partie de nom //ne recherche pas sur le disque dur mais sur une base de donnée
recherche rapide dans le répertoire actuel : locate "`pwd`*nomFichierOuDossier*"
mettre à jour la bd de locate : sudo updatedb
recherche approfondie : find
[chemin]
[-name "nomFichierOuDossier"]
[-size +10M] //k pour Ko G pour Go M pour Mo - pour fichiers moin que et + pour plus grand que, ne mettre aucun signe pour égal
[-atime 6] //dernier accès il y a 7 jours (numérotation commence à 0)
[-type d] //d pour directories (répertoires) ou f pour files (fichiers)
[-printf "%p - %u\n"] //exemple d'affichage formatté : ./photos/australie1.jpg - mateo21
[-delete]
[-exec chmod 600 {} \;]//-exec pour lancer une commande sur ce qui a été trouvé, {} seront remplacées par le nom du fichier et la commande doit finir par un \;
rechercher mot dans fichier : grep "texteARechercher" nomfichier
[-i : ne pas tenir compte de la casse (majuscules / minuscules)]
[-n : connaître les numéros des lignes]
[-v : inverser la recherche : ignorer un mot]
[-r : rechercher dans tous les fichiers et sous-dossiers] //indiquer un répertoire au lieu de nomfichier
[-E : Utiliser grep avec des expressions régulières] //sous linux, on peut utiliser les regex même sans -E mais ce n'est pas le cas dans toutes les machines Unix
trier les lignes d'un fichier : sort nomfichier //tri en ordre alphabétique par défaut (ne prend pas en compte la casse)
[-o nomfichierTrie : écrire le résultat dans un fichier]
[-r : trier en ordre inverse]
[-R : trier aléatoirement]
[-n : trier des nombres]
compter le nombre de lignes : wc nomfichier
[-l : compter le nombre de lignes]
[-w : compter le nombre de mots]
[-c : compter le nombre d'octets]
[-m : compter le nombre de caractères]
supprimer les doublons : uniq nomFichier [nomFichierSansDoublons] //le fichier doit être préalablement trié
[-c : compter le nombre d'occurrences]
[-d : afficher uniquement les lignes présentes en double]
couper une partie du fichier : cut
[-c [début]-[fin] nomFichier : couper selon un nombre de caractères] //conserve uniquement ces caractères pour chaque ligne. On peut mettre début sans fin ou fin sans début
[-d délimiteur -f numérosVoulus] //ex : cut -d , -f 1,3 notes.csv donne les champs 1 et 3. Il est également possible d'utiliser [début]-[fin] comme -c
rediriger le résultat d'une commande dans un fichier en écrasant : commande > nomFichier //si le fichier n'existe pas, il sera créé
rediriger le résultat d'une commande à la fin d'un fichier : commande >> nomFichier //si le fichier n'existe pas, il sera créé
rediriger les erreurs : ... redirection ... 2> nomFichierDestination // on peut mettre &1 au lieu de nomFichierDestination pour rediriger vers le même fichier que les résultats sans erreurs
envoyer du contenu à une commande : commande < sourceContenu
envoyer du contenu progressivement à une commande : commande << entreeQuiDelimiteLaFin //exemple : bit.ly/2QTYmEk
Combiner des commandes : commande1 | commande2 //tout ce qui sort de la commande1 est immédiatement envoyé à la commande2
______________________________
Processus
------------------------------
Vérifier ce qui se passe sur la machine : w
afficher liste des processus qui tournent à cet instant : ps
lister tous les processus lancés par tous les utilisateurs sur toutes les consoles : ps -ejHf
lister les processus lancés par un utilisateur : ps -u nomUtilisateur
liste dynamique des processus : top //ne peut pas afficher tous les processus à la fois, il ne conserve que les premiers pour qu'ils tiennent sur une « page » de la console.
tuer un processus : kill [-9 : forcer l'arrêt] PID //on peut mettre plusieurs PID à la suite (séparés par des espaces)
tuer plusieurs processus : killall nomProcessus
arrêter l'ordinateur : sudo halt
redémarrer l'ordinateur : sudo reboot
mesurer le temps que prends un processus : time commande //sur powershell : Measure-Command { commande | Out-Default }
lancer un processus en arrière-plan et détaché de la console : nohup commande
passer en arrière plan un processus déja lancé : appuyer sur Ctrl + Z puis taper bg
connaître les processus qu'on a lancé et qui tournent en arrière-plan : jobs
reprendre un processus au premier plan : fg %numéroProcessus //utiliser jobs pour connaitre le numéro
______________________________
Temps
------------------------------
afficher la date : date
modifier la date : sudo date MMDDhhmmYYYY
exécuter une commande à une heure précise : echo "commande à lancer" | at 09:00 //spécifier un temps plus précis (ex: dans 2 jours à 5h pm) : bit.ly/2PIpHIY
exécuter un fichier à une heure précise : at 09:00 -f /home/linuxize/script.sh
lister les commandes qui seront lancés plus tard : atq
supprimer une commandes qui sera lancée plus tard : atrm numéroCommande //utiliser atq pour trouver le numéro
Faire une pause : sleep nbSecondes //on peut aussi spécifier des minutes/heures/jours : bit.ly/31xx7l4
enchainer des commandes sur la même ligne : séparer par ; ou && pour empêcher les prochaines de s'executer si une précédente échoue
exécuter une commande à chaque intervalle : taper crontab -e puis suivre la doc ici bit.ly/3wfKBQv ou ici bit.ly/3sHnvQv
______________________________
Compression
------------------------------
créer une archive tar : tar -cvf nom_archive.tar nom_dossier/ //enlever -v pour ne pas voir le détail des opérations
afficher contenu archive tar : tar -tf nomArchive.tar
ajouter un fichier à une archive tar : tar -rvf nomArchive.tar nom_fichier_supplementaire
extraire les fichiers de l'archive tar : tar -xvf nomArchive.tar
compresser en gzip : gzip nomArchive.tar //la compression gzip est plus rapide que la bzip2
décompresser un gzip : gunzip nomArchive.tar.gz
compresser en bzip2 : bzip2 nomArchive.tar //la compression bzip2 est meilleure en terme de taille que celle de la gzip
décompresser un bzip2 : bunzip2 nomArchive.tar.bz2
archiver et compresser en gzip : tar -zcvf nom_archive.tar.gz nom_dossier/
décompresser et désarchiver un gzip : tar -zxvf nom_archive.tar.gz
archiver et compresser en bzip2 : tar -jcvf nom_archive.tar.bz2 nom_dossier/
décompresser et désarchiver un bzip2 : tar -jxvf nom_archive.tar.bz2
afficher directement un fichier compressé : utiliser zcat et zless (même fonctionnement que cat et less)
travailler avec des zip et des rar : bit.ly/3czGo2i
______________________________
Communication à distance
------------------------------
Transformer sa machine en serveur
installer openssh-server : sudo apt-get install openssh-server
générer clés : sudo ssh-keygen -A
lancer le serveur ssh : sudo /etc/init.d/ssh start //normalement, le serveur SSH est lancé à chaque démarrage de linux.
arrêter le serveur ssh : sudo /etc/init.d/ssh stop
recharger le serveur ssh : sudo /etc/init.d/ssh reload
Se connecter via SSH à partir d'une machine Linux : ssh [-p port] nomUtilisateur@adresseIpDestination
Se déconnecter d'une machine distante : logout
Identification automatique par clé : bit.ly/3mg0Ecu
télécharger un fichier de l'internet : wget url
[-c : reprendre un téléchargement arrêté]
copier des fichiers sur le réseau : scp [user@SRC_HOST:]nomFichierSource [user@DEST_HOST:]nomFichierDestination //garder le même nom : mettre un .
[-P numeroDePort : spécifier le numéro de port s'il est différent de 22]
se connecter à un serveur ftp : ftp adresseIpDestination //il va demander un login et un mot de passe. Pour les serveurs FTP publics, le login à utiliser est toujours anonymous avec n'importe quel mot de passe
envoyer un fichier vers le serveur ftp : put nomFichier // pour plusieurs fichiers en même temps, utiliser : mput nomFichier1 nomFichier2 ...
télécharger un fichier du serveur ftp : get nomFichier //pour plusieurs fichiers en même temps, utiliser : mget nomFichier1 nomFichier2 ...
définir la destination d'un téléchargement sur notre machine pendant qu'on est connecté à un serveur ftp : lcd chemin
lancer une commande sur notre machine pendant qu'on est connecté à un serveur ftp : précéder la commande par ! //ex: !pwd
supprimer un fichier sur le serveur ftp : delete nomFichier //et non pas rm (sauf en sftp)
se déconnecter d'un serveur ftp : exit
se connecter à un serveur sftp : sftp [-oPort=27401] nomUtilisateur@adresseIpDestination
synchroniser le contenu de deux répertoires : rsync -arv répertoire1 répertoire2 //exemple pour 2 ordinateurs différents : rsync -arv --delete Images/ mateo21@IP_du_serveur:mes_backups/ -e "ssh -p 12473"
[--delete : supprime les fichiers supprimés dans le répertoire1 aussi dans le répertoire2]
[--backup --backup-dir=cheminAbsolu : garder une trace des fichiers supprimés]
[à mettre après le répertoire : -e "ssh -p numeroDePort" : spécifier le numéro de port s'il est différent de 22]
Obtenir adresse ip à partir d'un nom d'hote ou inversement : host adresseIpOuNomHote //retourne le nom d'hote / l'adresse ip correspondant
Obtenir des informations sur un nom de domaine ou une adresse ip : whois adresseIpOuNomHote
lister les interfaces réseau de la machine : ifconfig
activer/désactiver interface réseau : ifconfig nomInterface {down|up} //ex : ifconfig eth0 up
afficher statistiques des interfaces réseau : netstat -i
afficher statistiques résumées : netstat -s
lister toutes les connexions ouvertes : netstat -uta //-utan pour voir les ports en numéro
gérer le pare-feu : bit.ly/3fQXsTF
______________________________
Bash
------------------------------
en-tête de script bash : #!/bin/bash
éxecuter un script bash : ./nomfichier.sh //s'assurer d'avoir les droits d'éxecution -> donner droits éxecution à un fichier : chmod +x nomfichier
déclarer une variable : maVariable='Bonjour tout le monde' //il ne faut pas mettre d'espaces autour du = //en bash, toutes les variables sont des string
afficher une variable : echo $maVariable //echo supporte qu'on lui envoie plusieurs paramètres (on les sépare par un espace)
double quotes : maDeuxiemeVariable="Le message est $maVariable" //évalue le contenu des variables à l'intérieur, donc maDeuxiemeVariable vaudra Le message est Bonjour tout le monde
back quotes : maVariable=`pwd` //pwd sera executée et son résultat sera stocké dans maVariable
demander une saisie : read uneVariable //uneVariable sera déclarée ou modifiée avec la valeur entrée
[-p 'un message' : afficher un message de prompt]
[-n nombreMax : limiter le nombre de caractères]
[-t secondesMax : limiter le temps autorisé pour saisir un message]
[-s : ne pas afficher le texte saisi]
effectuer des opérations mathématiques : let "c *= a + b"
Opérateurs mathématiques : + (addition) - (soustraction) * (multiplication) / (division entière) % (modulo) ** (puissance)
travailler avec des nombres décimaux : se renseigner sur la commande bc
afficher les variables d'environnement : env
variables automatiquements créés dans un script :
$# : contient le nombre de paramètres
$0 : contient le nom du script exécuté
$1 : contient le premier paramètre
...
$9 : contient le 9ième paramètre
pour utiliser plus que 9 paramètres, décaler les paramètres avec : shift
Tableaux
définir un tableau : tableau=('valeur0' 'valeur1' 'valeur2') //la taille du tableau n'est pas fixe. rien ne nous empêche de modifier la case 10, par exemple, pour cet exemple
accéder à une case de tableau : ${tableau[2]} //la première case commence à 0
modifier le contenu d'une case : tableau[2]='valeur2'
afficher l'ensemble du contenu d'un tableau : echo ${tableau[*]}
Conditions
Syntaxe if ↓
................
if [ $1 == "Bruno" ]; then //il faut absolument mettre des espaces autour de la condition (if[test] ne marchera pas)
echo "C'est vrai"
elif [ $# -ge 1 ] && [ ! -e fichier ]; then
echo "Hey"
else
echo "wow"
fi
................
Opérateurs de comparaison
$chaine1 == $chaine2 : Vérifie si les deux chaînes sont identiques. Notez que bash est sensible à la casse : « b » est donc différent de « B ».
$chaine1 != $chaine2 : Vérifie si les deux chaînes sont différentes.
-z $chaine : Vérifie si la chaîne est vide.
-n $chaine : Vérifie si la chaîne est non vide.
$num1 -eq $num2 : Vérifie si les nombres sont égaux (equal). À ne pas confondre avec le « = » qui, lui, compare deux chaînes de caractères.
$num1 -ne $num2 : Vérifie si les nombres sont différents (nonequal). Encore une fois, ne confondez pas avec « != » qui est censé être utilisé sur des chaînes de caractères.
$num1 -lt $num2 : Vérifie si num1 est inférieur ( < ) à num2 (lowerthan).
$num1 -le $num2 : Vérifie si num1 est inférieur ou égal ( <= ) à num2 (lowerorequal)
$num1 -gt $num2 : Vérifie si num1 est supérieur ( > ) à num2 (greaterthan).
$num1 -ge $num2 : Vérifie si num1 est supérieur ou égal ( >= ) à num2 (greaterorequal).
-e $nomfichier : Vérifie si le fichier existe.
-d $nomfichier : Vérifie si le fichier est un répertoire. N'oubliez pas que sous Linux, tout est considéré comme un fichier, même un répertoire !
-f $nomfichier : Vérifie si le fichier est un… fichier. Un vrai fichier cette fois, pas un dossier.
-L $nomfichier : Vérifie si le fichier est un lien symbolique (raccourci).
-r $nomfichier : Vérifie si le fichier est lisible (r).
-w $nomfichier : Vérifie si le fichier est modifiable (w).
-x $nomfichier : Vérifie si le fichier est exécutable (x).
$fichier1 -nt $fichier2 : Vérifie sifichier1est plus récent que fichier2 (newerthan).
$fichier1 -ot $fichier2 : Vérifie sifichier1est plus vieux que fichier2 (olderthan).
Opérateurs de logique : && (et) || (ou) ! (non)
Syntaxe case ↓
................
case $1 in
"Chien" | "Chat" | "Souris")
echo "C'est un mammifère"
;;
"Moineau" | "Pigeon")
echo "C'est un oiseau"
;;
*)
echo "Je ne sais pas ce que c'est"
;;
esac
................
Boucles
Syntaxe boucle while ↓
................
while [ test ]; do
echo 'Action en boucle'
done
................
Syntaxe boucle for ↓
................
for i in `seq 1 10`; //autre exemple : for fichier in $liste_fichiers
do
echo $i
done
................
déclarer une fonction ↓
................
function maFonction
{
echo $1
}
................
appeler une fonction : maFonction arg1 arg2 ...
enregistrer valeur de retour d'une fonction : maVariable="$(maFonction arg1)"
______________________________
Scripts personnalisés
------------------------------
Changer l'encodage pour tous les fichiers du répertoire : find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;