我有一个文本文件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)
但它不起作用。
请注意,创建tar文件的标准 (POSIX/Unix) 命令是pax. pax结合了传统cpio和tar命令。
要创建 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)
我不确定你在哪里读到 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)