Suis-je aveugle ou n'y a-t-il pas d'option comme --in-place
pour sort
?
Afin de sauvegarder les résultats dans le fichier d’entrée, sed utilise -i
( --in-place
).
Rediriger la sortie de sort
vers le fichier d'entrée
sort < f > f
a pour résultat de le rendre vide. S'il n'y a pas d' --in-place
option - peut-être y a-t-il une astuce pour faire cela d'une manière pratique ?
(La seule chose qui me vienne à l’esprit:
sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$
Déplacer n’est pas un choix judicieux, les autorisations sur les fichiers peuvent être modifiées. C'est pourquoi j'écrase le contenu du fichier temporaire que je supprime ensuite.)
text-processing
sort
Grzegorz Wierzowiecki
la source
la source
insitu
, permettant à toutes les commandes d'être utilisées sur place.sort
.Réponses:
sort
a l'-o, --output
option qui prend un nom de fichier en argument. S'il est identique au fichier d'entrée, le résultat est écrit dans un fichier temporaire, puis le fichier d'origine est écrasé (exactement la même chose que ce qui estsed -i
fait).De la
GNU sort
page d'information:et de The Open Group Base Specifications Issue 7 :
la source
man sort
- est-ce une fonctionnalité non documentée? Est-ce standard et portable?sort -o <filename> <filename>
va trier en toute sécurité un fichier en place.Vous pouvez utiliser la
sponge
fonction, qui imbibe d'abord lestdin
, puis l'écrit dans un fichier, comme:L'inconvénient
sponge
est qu'il stockera temporairement la sortie dans la mémoire, ce qui peut poser problème pour les gros fichiers. Sinon, vous devez d'abord l'écrire dans un fichier, puis écraser le fichier d'origine.Comme le soulignent d’autres réponses, les modifications sur place ne sont généralement pas une bonne idée, car au milieu d’un processus (celui par exemple
sponge
), la machine risque de tomber en panne et de perdre le fichier original et le nouveau. Vous feriez mieux de l'écrire d'abord dans un fichier différent, puis d'utiliser unemv
instruction atomique (déplacer).la source
Il est dangereux de remplacer le fichier d'entrée par le fichier de sortie, car si le programme ou le système se bloque pendant l'écriture du fichier, vous avez perdu les deux.
Quelques programmes (principalement les versions GNU) ont une option in-situ (par exemple
-i
, perl et GNU sed;-o
sur le type GNU). Ils travaillent en plaçant les données dans un fichier temporaire, puis en les déplaçant. Pour les programmes qui n'ont pas cette option, Colin Watsonsponge
utilitaire (inclus dans les moreutils de Joey Hess ) fait le travail en toute sécurité pour tout programme (exemples: Puis - je fairecut
? Modifier un fichier en place , Comment puis - je faire iconv remplacer le fichier d'entrée avec le converti sortie? ).Dans les rares cas où vous ne pouvez pas recréer le fichier d'origine avec les mêmes autorisations, je vous recommande de remplacer le fichier en place. Dans ce cas, vous feriez mieux de sauvegarder l’entrée originale quelque part. Ensuite, vous pouvez simplement traiter la copie de l’entrée et l’envoyer dans le fichier original.
la source
sort -o
n’est pas spécifique à GNU et est spécialement conçu pour effectuer une rotation générale du fichier en place.sort
ne peut pas commencer à écrire sa sortie avant d’avoir lu toutes ses entrées (utilise de la mémoire ou des fichiers temporaires pour stocker des données), il est donc tout à fait naturel qu’elle puisse remplacer son entrée.sort
n’est pas POSIX, car ilsort -mo file1 file1 file2
n’est pas garanti que cela fonctionne, alors que lessort
gens traditionnels savent comment contourner ce problème (déjà sous Unix V7 dans les années 70).sort -o
travaille pour moi avec coreutils 8.25 et la propriété est documentée dans le manuel (notez que ce n'est que le cas lors du tri, pas lors de la fusion). Si vous pouvez le reproduire, envoyez un rapport de bogue (indiquant la ligne de commande exacte, le ou les fichiers d'entrée exacts, le système sur lequel vous l'exécutez et comment vous avez obtenu le binaire).Utilisez
-o
ou essayez vim-way:la source