如何将一个文件作为输入发送到另一个文件?

如何将一个文件作为输入发送到另一个文件?

通过命令 shell,我们可以重定向三个标准文件流,以便我们可以从文件或其他命令而不是从键盘获取输入,并且我们可以将输出和错误写入文件或将它们作为后续命令的输入发送。

那么为什么我们不能将输入提供给其他文件

~# /root/Documents/text1.txt > /root/Documents/text2.txt

答案1

您无法使用file1 > file2来复制file1的内容,file2因为那里没有命令。您必须发出一些命令。

  • 重定向适用于 (1) 您运行的命令或 (2) 整个 shell(如果应用于exec内置命令)。但它们通过更改执行输入输出操作(即读取或写入文件或设备)的操作的源或目标来工作。您必须实际执行一些操作。
  • file1 > file2在某些情况下是有效的命令,但它不会复制file1file2。相反,l0b0 说,它试图跑步 file1作为程序或脚本,并且——无论是否成功——发送标准输出以免陷入file1file2(如果file2是常规文件,则会被覆盖。)
  • 很容易让人认为类似的东西<file1 >file2会起作用。但事实并非如此:当你停止命令时,不会执行任何操作。file1用作输入并file2用作输出……但因为什么都没做,输出为空,唯一的效果是(a)file2如果它不存在则创建,或(b)file2如果它存在则清空:

    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

假设这file2是一个常规文件(或者不存在,但你希望它在命令运行后作为常规文件存在),你应该简单地使用cp命令。

作为西尔万·皮诺 说cat file1 > file2,您也可以使用。但是,cp当写入已存在的文件时,该命令表现良好:它用源覆盖目标,但保留目标的原始权限掩码(因此即使在人们直觉认为cat file1 > file2需要的情况下也是很好的):

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

附加,您可能确实想要一个(不同类型的)重定向。

命令cp和重定向>都会覆写常规文件的内容(如果存在)。但>>重定向会附加。

file1因此,如果您想将的内容附加到,file2而不是file2用的内容覆盖file1,则可以使用>>(不是 >)是一个不错的选择:

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.

答案2

您可以使用以下命令重定向 text1.txt 的内容cat

~# cat /root/Documents/text1.txt > /root/Documents/text2.txt

笔记:您还可以使用cat它来创建新的二进制文件,例如:

~# cat mypic.jpg > my_new_pic.jpg

答案3

扩展@SylvainPineau 的回答,你不能这样做的原因/root/Documents/text1.txt > /root/Documents/text2.txt是,重定向操作符和它后面的文件分开的东西必须是命令。当你执行时,/root/Documents/text1.txt > /root/Documents/text2.txt你正在告诉 shell执行 /root/Documents/text1.txt,由于文本文件不应设置执行标志,因此它可能不会运行,并将标准输出保存到/root/Documents/text2.txt。由于该“命令”的标准输出为空,因此目标文件将为空。

答案4

正如其他人已经指出的那样,您缺少一个命令。以下是一些有趣的组合:

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

管道/重定向的精神表明需要一个命令(例如复制、提取、计数、编码/解码、压缩/解压缩)来指定将输入转换file1.txt为输出的操作file2.txt

相关内容