J'ai un script bash qui énumère tous les fichiers * .php d'un répertoire et s'applique iconv
à celui-ci. Ceci est affiché dans STDOUT.
Étant donné que l'ajout du -o
paramètre (selon mon expérience) écrit en fait un fichier vide probablement avant que la conversion ait lieu, comment puis-je ajuster mon script pour qu'il effectue la conversion, puis écrase le fichier d'entrée?
for file in *.php
do
iconv -f cp1251 -t utf8 "$file"
done
shell
text-processing
io-redirection
meder omuraliev
la source
la source
Réponses:
Cela ne fonctionne pas, car il
iconv
crée d’abord le fichier de sortie (puisque le fichier existe déjà, il le tronque), puis commence à lire son fichier d’entrée (qui est maintenant vide). La plupart des programmes se comportent de cette façon.Créez un nouveau fichier temporaire pour la sortie, puis déplacez-le.
Si votre plate-forme
iconv
n'en possède pas-o
, vous pouvez utiliser une redirection de shell dans le même sens.L'
sponge
utilitaire de Colin Watson (inclus dans les moreutils de Joey Hess ) automatise ceci:Cette réponse ne s’applique pas seulement à
iconv
mais à n’importe quel programme de filtrage. Quelques cas particuliers méritent d’être mentionnés:-p
ont une-i
option pour remplacer les fichiers en place.grep
,tr
,sed 's/long input text/shorter text/'
), et vous aimez vivre dangereusement, vous pouvez vraiment modifier le fichier en place (les autres solutions mentionnées créent ici une nouveau fichier de sortie et déplacez-le à la fin pour que les données d'origine restent inchangées si la commande est interrompue pour une raison quelconque).la source
sponge
doit être attribuée exclusivement à Joey Hess; c’est le paquetmoreutils
qui comprendsponge
ce qu’il maintient, mais en ce qui concerne l’origine desponge
, en suivant les liens de la page d’accueil demoreutils
, j’ai trouvé ce message posté et suggéré par Colin Watson: "Joey écrit à propos du manque de nouveaux outils rentrez dans la philosophie Unix. Ce que j’ai écrit de ce type est ce que je préfèresponge
"(lun. 06 févr. 2006).iconv -f cp1251 -t utf8 "$file" > "$file.new"
sort
, sont assez intelligentes en ce qui concerne les-o
paramètres. Si elles détectent un fichier de sortie identique à une entrée, elles gèrent en interne un fichier temporaire afin que celui-ci fonctionne.Une alternative est d'
recode
utiliser la bibliothèque libiconv pour certaines conversions. Son comportement est de remplacer le fichier d'entrée par la sortie, cela fonctionnera donc:Comme
recode
accepte plusieurs fichiers d’entrée en paramètre, vous pouvez épargner lafor
boucle:la source
info recode
plutôt. Est plus verbeux.Pour l'instant
fonctionne comme un charme
la source
Vous pouvez utiliser Vim en mode Ex:
%
sélectionner toutes les lignes!
commande d'exécutionx
sauver et fermerla source
Voici un exemple simple . Cela devrait vous donner assez d’informations pour commencer.
la source
travaille pour moi
la source
Vous pouvez utiliser find, au moins cela a fonctionné pour moi sur Raspbian Stretch:
la source
Une option consiste à utiliser
perl
l'interfaceiconv
et le-i
mode d'édition in-situ de:Avec GNU
awk
, vous pouvez également faire quelque chose comme:Le
ksh93
shell a également un>;
opérateur pour celui qui stocke la sortie dans un fichier temporaire renommé en fichier redirigé si la commande aboutit:la source