copy_file_range - Linux
Overview
copy_file_range is a Linux command used to efficiently copy data between two open file descriptors. It’s particularly useful for performing quick and optimized file-to-file transfers.
Syntax
copy_file_range(fd_in, offset_in, fd_out, offset_out, len)
| Parameter | Description |
|—|—|
| fd_in | File descriptor of the source file |
| offset_in | Offset within the source file from where to start copying |
| fd_out | File descriptor of the destination file |
| offset_out | Offset within the destination file where to copy data |
| len | Number of bytes to copy |
Options/Flags
This command does not support any options or flags.
Examples
Example 1: Copying a File to Another File
Copy the contents of source.txt to destination.txt, starting from byte 0 in both files:
copy_file_range(fd_in=open("source.txt", "r"), offset_in=0, fd_out=open("destination.txt", "w"), offset_out=0, len=os.path.getsize("source.txt"))
Example 2: Copying a Range of Data
Copy 100 bytes from offset 100 in source.txt to offset 200 in destination.txt:
copy_file_range(fd_in=open("source.txt", "r"), offset_in=100, fd_out=open("destination.txt", "w"), offset_out=200, len=100)
Common Issues
- Invalid File Descriptor: Ensure that both fd_in and fd_out point to valid open file descriptors.
- Invalid Offset: Verify that the provided offsets are within the bounds of the respective files.
- Insufficient Permissions: Check if you have write permissions to the destination file and read permissions to the source file.
Integration
copy_file_range can be used in combination with other Linux commands for advanced tasks:
- dd: Replicate file contents alongside performing other operations (e.g., conversion, filtering):
dd if=/dev/zero bs=1024 count=1000 conv=sync,notrunc | dd of=/dev/sda2 conv=fdatasync,nocreat
- cat: Concatenate files while leveraging copy_file_range for optimized copying:
cat file1 file2 file3 | copy_file_range fd_in=- fd_out=4 offset_out=0 len=`cat file1 file2 file3 | wc -c`
Related Commands
- sendfile: Transfers data between sockets and files more efficiently than
read() + write()
. - splice: Transfers data between pipe buffers, similar to
copy_file_range
but for pipes.