将文件从一个目录复制到另一个目录

将文件从一个目录复制到另一个目录

我必须将一组文件从一个文件夹复制到另一个文件夹,并且我使用以下命令:

cp -rf `head -n 100 /home/tmp/abc.txt` /home/tmp/test/files

文件内容abc.txt如下:

./folder1/example.tar.gz
./folder2/example.tar.gz
./folder3/example.tar.gz

但是在执行上述cp命令时我得到了:

cp: will not overwrite just-created `/home/tmp/test/files/example.tar.gz' with `./folder3 /example.tar.gz'
cp: will not overwrite just-created `/home/tmp/test/files/example.tar.gz' with `./folder1/example.tar.gz'

我可以理解,因为 .gz 文件的名称与错误中显示的名称相同。我想要做的是内部具有/home/tmp/test/files与 中列出的相同的文件夹结构abc.txt,例如:

/home/tmp/test/files/folder1/example.tar.gz
/home/tmp/test/files/folder2/example.tar.gz
/home/tmp/test/files/folder3/example.tar.gz

example.tar.gz但执行上述命令后我只得到一个内部文件夹cp

那么如何获得我上面提到的内容呢?

答案1

cp 不行

您的示例将不起作用,因为复制不会复制目录结构,它只会复制文件,因此您会遇到错误消息。要执行此类深层复制,您可以使用该tar命令并使用构造tar cvf - --files-from=... | (cd /home/tmp/test/files/; tar xvf -),也可以仅使用rsync.

同步

如果我是你,我会这样做rsync

$ rsync -avz --files-from=abc.txt /src /home/tmp/test/files/.

如果您只需要文件中的前 100 行,abc.txt您可以这样做:

$ rsync -avz --files-from=<(head -n 100 abc.txt) /src /home/tmp/test/files/.

例子

示例文件夹数据:

$ tree /home/saml/tmp/folder*
/home/saml/tmp/folder1
`-- example.tar.gz
/home/saml/tmp/folder2
`-- example.tar.gz
/home/saml/tmp/folder3
`-- example.tar.gz

现在复制文件:

$ rsync -avz --files-from=<(head -n 3 /home/saml/tmp/abc.txt) \
         /home/saml/tmp/. /home/saml/tmp/test/files/.
building file list ... done
./
folder1/
folder1/example.tar.gz
folder2/
folder2/example.tar.gz
folder3/
folder3/example.tar.gz

sent 3147093 bytes  received 81 bytes  6294348.00 bytes/sec
total size is 3145728  speedup is 1.00

确认它们已被复制:

$ tree /home/saml/tmp/test/files
/home/saml/tmp/test/files
|-- folder1
|   `-- example.tar.gz
|-- folder2
|   `-- example.tar.gz
`-- folder3
    `-- example.tar.gz

柏油

如果您有兴趣,这里是您如何使用tar.

$ cd /home/saml/tmp
$ tar cvf - --files-from=<(head -n 3 /home/saml/tmp/abc.txt) | (cd /home/saml/tmp/test/files/; tar xvf -)
./folder1/example.tar.gz
./folder1/example.tar.gz
./folder2/example.tar.gz
./folder2/example.tar.gz
./folder3/example.tar.gz
./folder3/example.tar.gz

确认已复制:

$ tree /home/saml/tmp/test/files
/home/saml/tmp/test/files
|-- folder1
|   `-- example.tar.gz
|-- folder2
|   `-- example.tar.gz
`-- folder3
    `-- example.tar.gz

答案2

问题肯定不是cp不复制目录结构。当然可以:(cp -r递归)。

cp至少 POSIX不做cp的是在目标目录中重新创建源操作数的相对路径。

如果你cp a/b/file1 a/b/file2 a/c/file3 dest那么你就得到了dest/file1 dest/file2 dest/file3

如果您cp使用的是 GNU Coreutils,它可能有这个--parents选项。不确定什么时候引入的。cp --parents将诱导 GNUcp产生此路径重新创建机制。来自信息文档:

--parents
  Form the name of each destination file by appending to the target
  directory a slash and the specified name of the source file.  The
  last argument given to `cp' must be the name of an existing
  directory.  For example, the command:

      cp --parents a/b/c existing_dir

  copies the file `a/b/c' to `existing_dir/a/b/c', creating any
  missing intermediate directories.

因此,如果您有 GNU cp,您需要的唯一更改就是删除,-r因为我们不递归,并使用--parents

cp --parents -f `head -n 100 /home/tmp/abc.txt` /home/tmp/test/files

相关内容