web-dev-qa-db-fra.com

Comment envoyer un fichier en tant qu'entrée dans un autre fichier?

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
7
arvind

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.

  • Les redirections s'appliquent à (1) une commande que vous exécutez ou (2) au Shell dans son ensemble (si appliqué à la variable intégrée 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
    

Vous voulez probablement juste exécuter 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

Pour ajouter , vous voulez probablement une redirection (différente).

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.
17
Eliah Kagan

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
8
Sylvain Pineau

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.

1
l0b0

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:

  1. cat file1 > file2 (copiera le contenu du fichier1 dans un nouveau fichier fichier2)
  2. cat file2 >> file1 (copiera ici le contenu du fichier2 dans un fichier existant fichier1 sans supprimer son contenu)
  3. 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.

0
nux

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.

0
Stephen Quan