Grâce à la commande Shell, nous pouvons rediriger les trois flux de fichiers standard afin que nous puissions obtenir une entrée d'un fichier ou d'une autre commande plutôt que de notre clavier, et nous pouvons écrire la sortie et les erreurs dans des fichiers ou les envoyer en tant qu'entrée pour les commandes suivantes.
Alors, pourquoi ne pouvons-nous pas entrer dans un autre fichier en tant que
~# /root/Documents/text1.txt > /root/Documents/text2.txt
Vous ne pouvez pas utiliser file1 > file2
pour copier le contenu de file1
dans file2
car il n'y a pas de commande. Vous devez émettre une commande.
exec
). Mais ils travaillent en modifiant la source ou la cible des actions qui effectuent des opérations d’entrée-sortie, c’est-à-dire qui lisent ou écrivent dans un fichier ou un périphérique. Vous devez réellement effectuer une action.file1 > file2
est une commande valide, dans certaines circonstances, mais ne copie pas file1
dans file2
. Comme comme dit l0b , il tente de exécuter file1
en tant que programme ou script, et - si ou pas qui réussit - envoie le sortie standard à partir de file1
en cours d'exécution dans file2
. (Si file2
est un fichier normal, il est écrasé.)Il est tentant de penser que quelque chose comme <file1 >file2
fonctionnerait. Mais ce n'est pas le cas: lorsque vous quittez la commande, aucune opération n'est effectuée. file1
est utilisé en tant qu'entrée et file2
est utilisé en tant que sortie ... mais depuis rien n'est réellement fait , la sortie est vide, le seul effet est de (a) créer file2
s'il n'existait pas déjà, ou (b) de rendre file2
vide s'il le faisait:
ek@Ilex:~$ echo foobar > file1
ek@Ilex:~$ echo quux > file2
ek@Ilex:~$ cat file1
foobar
ek@Ilex:~$ cat file2
quux
ek@Ilex:~$ <file1 >file2
ek@Ilex:~$ cat file2
ek@Ilex:~$ file file1 file2
file1: ASCII text
file2: empty
cp file1 file2
.En supposant que file2
soit un fichier normal (ou n’existe pas, mais vous voulez qu’il existe comme fichier normal après l’exécution de votre commande), vous devriez probablement simplement utiliser cp
= commande.
Comme dit Sylvain Pinea , vous pouvez aussi utiliser cat file1 > file2
. Cependant, la commande cp
se comporte bien lors de l'écriture dans un fichier qui existe déjà: elle écrase la cible avec la source, mais conserve l'original masque d'autorisations (et est donc bon même dans les cas où pourrait penser intuitivement que cat file1 > file2
était nécessaire):
ek@Ilex:~$ echo glockenspiel > file1
ek@Ilex:~$ echo flugelhorn > file2
ek@Ilex:~$ cat file1
glockenspiel
ek@Ilex:~$ cat file2
flugelhorn
ek@Ilex:~$ chmod +x file2
ek@Ilex:~$ ls -l file1 file2
-rw-rw-r-- 1 ek ek 13 Sep 16 03:28 file1
-rwxrwxr-x 1 ek ek 11 Sep 16 03:28 file2
ek@Ilex:~$ cp file1 file2
ek@Ilex:~$ cat file2
glockenspiel
ek@Ilex:~$ ls -l file1 file2
-rw-rw-r-- 1 ek ek 13 Sep 16 03:28 file1
-rwxrwxr-x 1 ek ek 13 Sep 16 03:28 file2
La commande cp
et la redirection avec >
écraseront le contenu d'un fichier normal, s'il existe. Mais la redirection >>
s’ajoute.
Donc, si vous voulez ajouter le contenu de file1
à file2
au lieu de remplacer file2
par le contenu de file1
, une redirection avec >>
( not >
) est un bon choix:
ek@Ilex:~$ echo 'Violets are blue.' > file1
ek@Ilex:~$ echo 'Roses are red.' > file2
ek@Ilex:~$ cat file1
Violets are blue.
ek@Ilex:~$ cat file2
Roses are red.
ek@Ilex:~$ cat file1 >> file2
ek@Ilex:~$ cat file2
Roses are red.
Violets are blue.
Vous pouvez rediriger le contenu de text1.txt à l'aide de la commande cat
:
~# cat /root/Documents/text1.txt > /root/Documents/text2.txt
Note: vous pouvez utiliser cat
pour créer également de nouveaux fichiers binaires, par exemple:
~# cat mypic.jpg > my_new_pic.jpg
Pour développer réponse de SylvainPinea , la raison pour laquelle vous ne pouvez pas faire /root/Documents/text1.txt > /root/Documents/text2.txt
est que l'élément distinct de l'opérateur de redirection et du fichier après doit être un commande. Lorsque vous exécutez /root/Documents/text1.txt > /root/Documents/text2.txt
, vous indiquez au shell de exécuter /root/Documents/text1.txt
, qui ne fonctionnera probablement même pas car les fichiers texte ne devraient pas avoir le drapeau d'exécution défini, et sauvegardent la sortie standard dans /root/Documents/text2.txt
. Puisque la sortie standard de cette "commande" est vide, le fichier cible sera vide.
Sortie de commande Redirection:
ls > file.txt
ls donne une liste de répertoires et la sortie de la commande ls est redirigée vers fichier.txt.
Erreur de redirection:
command 2>~/Desktop/errorsfile.txt
Cela redirigera le résultat d'erreur de la commande vers un fichier txt
.
Pour la redirection du contenu du fichier:
cat file1 > file2
(copiera le contenu du fichier1 dans un nouveau fichier fichier2)cat file2 >> file1
(copiera ici le contenu du fichier2 dans un fichier existant fichier1 sans supprimer son contenu)cat file1 file2 > file3
(Cela ajouterait le contenu de 'fichier1' et 'fichier2', puis écrirait ce contenu dans un nouveau fichier nommé 'fichier3')Je voudrais aussi ajouter la redirection d'entrée:
$ mail -s "Hello World" [email protected] < /home/user/mailcontent.txt
Ici, si le corps du courrier est dans un fichier, nous pouvons l’utiliser directement pour envoyer le courrier.
Comme d'autres l'ont déjà dit, il vous manque une commande. Voici quelques combinaisons intéressantes:
cat <file1.txt >file2.txt
tail <file1.txt >file2.txt
head <file1.txt >file2.txt
wc -l <file1.txt >file2.txt
base64 <file1.txt >file2.txt
base64 -D <file1.txt >file2.txt
gzip -c <file1.txt >file2.txt
gunzip -c <file1.txt >file2.txt
L'esprit Piping/Redirecting indique qu'une commande (telle que copier, extraire, compter, encoder/décoder, compresser/décompresser) est nécessaire pour spécifier l'action permettant de transformer l'entrée file1.txt
en sortie file2.txt
.