How to append one file to another in Linux from the shell?

后端 未结 8 1490
我寻月下人不归
我寻月下人不归 2020-12-04 04:44

I have two files: file1 and file2. How do I append the contents of file2 to file1 so that contents of file1

相关标签:
8条回答
  • 2020-12-04 05:18

    Use bash builtin redirection (tldp):

    cat file2 >> file1
    
    0 讨论(0)
  • 2020-12-04 05:19

    cat file2 >> file1

    The >> operator appends the output to the named file or creates the named file if it does not exist.

    cat file1 file2 > file3

    This concatenates two or more files to one. You can have as many source files as you need. For example,

    cat *.txt >> newfile.txt

    Update 20130902
    In the comments eumiro suggests "don't try cat file1 file2 > file1." The reason this might not result in the expected outcome is that the file receiving the redirect is prepared before the command to the left of the > is executed. In this case, first file1 is truncated to zero length and opened for output, then the cat command attempts to concatenate the now zero-length file plus the contents of file2 into file1. The result is that the original contents of file1 are lost and in its place is a copy of file2 which probably isn't what was expected.

    Update 20160919
    In the comments tpartee suggests linking to backing information/sources. For an authoritative reference, I direct the kind reader to the sh man page at linuxcommand.org which states:

    Before a command is executed, its input and output may be redirected using a special notation interpreted by the shell.

    While that does tell the reader what they need to know it is easy to miss if you aren't looking for it and parsing the statement word by word. The most important word here being 'before'. The redirection is completed (or fails) before the command is executed.

    In the example case of cat file1 file2 > file1 the shell performs the redirection first so that the I/O handles are in place in the environment in which the command will be executed before it is executed.

    A friendlier version in which the redirection precedence is covered at length can be found at Ian Allen's web site in the form of Linux courseware. His I/O Redirection Notes page has much to say on the topic, including the observation that redirection works even without a command. Passing this to the shell:

    $ >out
    

    ...creates an empty file named out. The shell first sets up the I/O redirection, then looks for a command, finds none, and completes the operation.

    0 讨论(0)
  • 2020-12-04 05:19

    Try this command:

    cat file2 >> file1
    
    0 讨论(0)
  • 2020-12-04 05:29

    Note: if you need to use sudo, do this:

    sudo bash -c 'cat file2 >> file1'

    The usual method of simply prepending sudo to the command will fail, since the privilege escalation doesn't carry over into the output redirection.

    0 讨论(0)
  • 2020-12-04 05:36

    Another solution:

    cat file1 | tee -a file2
    

    tee has the benefit that you can append to as many files as you like, for example:

    cat file1 | tee -a file2 file3 file3
    

    will append the contents of file1 to file2, file3 and file4.

    From the man page:

    -a, --append
           append to the given FILEs, do not overwrite
    
    0 讨论(0)
  • 2020-12-04 05:37

    cat can be the easy solution but that become very slow when we concat large files, find -print is to rescue you, though you have to use cat once.

    amey@xps ~/work/python/tmp $ ls -lhtr
    total 969M
    -rw-r--r-- 1 amey amey 485M May 24 23:54 bigFile2.txt
    -rw-r--r-- 1 amey amey 485M May 24 23:55 bigFile1.txt
    
     amey@xps ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt
    
    real    0m3.084s
    user    0m0.012s
    sys     0m2.308s
    
    
    amey@xps ~/work/python/tmp $ time find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1
    
    real    0m2.516s
    user    0m0.028s
    sys     0m2.204s
    
    0 讨论(0)
提交回复
热议问题