将文件从列表复制到文件夹

Man*_*ano 3 shell file-copy

我有一个文本文件abc.txt,其内容是:

   /lag/cnn/org/one.txt
   /lag/cnn/org/two.txt
   /lag/cnn/org/three.txt
Run Code Online (Sandbox Code Playgroud)

如果我使用:

$ tar -cvf allfiles.tar -T abc.txt
Run Code Online (Sandbox Code Playgroud)

我正在获取列表中文件的 tar。同样,是否可以将这些文件复制abc.txt到文件夹中?

我试过这个:

$ cp --files-from test1.txt ./Folder
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

Sté*_*las 6

请注意,创建tar文件的标准 (POSIX/Unix) 命令是pax. pax结合了传统cpiotar命令。

要创建 tar 文件,请使用写入模式:

pax -w < abc.txt > allfiles.tar
Run Code Online (Sandbox Code Playgroud)

要复制,请使用复制模式:

pax -rw < abc.txt Folder/
Run Code Online (Sandbox Code Playgroud)

请注意,它会将目录结构重新创建为Folder. 如果你想把它弄平,你可以这样做:

pax -rws '|.*/||' < abc.txt Folder/
Run Code Online (Sandbox Code Playgroud)

(如果您还想复制权限或其他属性,请参阅手册页。pax每行需要一个文件,这意味着不能以这种方式复制名称包含换行符的文件,某些pax实现支持-0允许使用NUL分隔文件列表的选项) .

cpio

cpio -pd < abc.txt Folder/
Run Code Online (Sandbox Code Playgroud)

使用 GNU tar

tar -cf - -T abc.txt | (cd Folder && tar xf -)
Run Code Online (Sandbox Code Playgroud)

允许文件名中的任何字符的另一个选项是(使用 GNU cp):

xargs cp -t Folder < abc.txt
Run Code Online (Sandbox Code Playgroud)

(使目录变平)。

xargs需要一个空白(空格、制表符、换行符)分隔的列表,当您可以使用反斜杠、单引号或双引号对这些分隔符进行转义时。所以你可以有一个列表:

"file with space"
other-file
'file with "quote" and
newline'
Run Code Online (Sandbox Code Playgroud)


Chr*_*own 5

我不确定你在哪里读到 cp 有一个--files-from选项,但我当然没有使用 GNU coreutils 8.22 的选项。

只要您的文件名中没有换行符,您就可以这样做(使用 bash4+):

mapfile -t files < test1.txt
cp -- "${files[@]}" Folder/
Run Code Online (Sandbox Code Playgroud)

如果您没有 bash4+,那么您可以手动填充一个数组并使用它(或者cp直接从内部read为每个文件调用,但这会更慢):

while IFS= read -r file; do
    files+=( "$file" )
done < test1.txt
cp -- "${files[@]}" Folder/
Run Code Online (Sandbox Code Playgroud)