Tar 个来自不同目录但没有路径的文件
Tar files from different directories without paths
I have a following structure:
-folder1
-folder2
-file1
-file2
-folder3
-folder4
-folder5
-file3
-file4
使用 bash 我需要在实际目录 中创建一个 .tar 存档 ,它将包含 4 个文件(文件 1、文件 2、文件 3、文件 4).我尝试过的所有内容都会生成文件及其路径的存档。我需要的是 文件 的存档,其中必须包含:
file1
file2
file3
file4
简单的解决方案是创建硬 links 到 /tmp,然后从那里存档,像这样:
mkdir /tmp/allfiles
find /home/user/folder1 -type f | while read file
do
ln $file /tmp/allfiles
done
cd /tmp/allfiles
tar cvf /tmp/myarchive.tar *
rm /tmp/allfiles/*
rmdir /tmp/allfiles
请注意,hard link 仅在 /tmp 和 ~/folder1 在同一文件系统上时才有效。这只会使 links 而不会占用额外的磁盘空间。
您可以先删除 rm 命令。脚本中的类型可能会产生不良结果:-)。
在不创建任何临时目录的情况下尝试此操作:
find .type f | pax -wv -s '/.*\///g' -f file.tar
来自 man pax
:
pax — read and write file archives and copy directory hierarchies
由于tar
是用来存储目录结构的,如果你不想保留它们,你必须先删除它们...
为此,您可以创建临时目录以在一个 uniq 级别存储 symlinks:
tmpdir=$(mktemp -d /tmp/tardir-XXXXXX)
find $PWD -type f -exec ln -st $tmpdir {} +
cd $tmpdir
tar -chvf /tmp/myarchive.tar *
cd -
rm -fR $tmpdir
备注:
$PWD
强制 find
到 link 到临时目录的整个路径。
-h
tar
的选项告诉他存储指向的文件而不是 symlink。
如果您知道文件名及其目录,您可以使用 -C
/--directory
选项让 tar 在处理参数时更改其操作目录。
所以这个命令:
tar -cf files.tar.gz -C folder1/folder2 file1 file2 -C ../folder3/folder4 file3 file4
将在当前目录中创建 files.tar.gz
,其中只有文件。
如果需要,您可以通过一些脚本自动从 find
输出或类似内容创建必要的命令行参数。
(您不能在文件参数位置使用像 folder1/folder2/*
这样的 glob,因为这些文件名中的路径会导致 tar
找不到它们。您可以使用 $(ls folder1/folder2/)
在那个位置,但对于许多有效的文件名来说,这显然不安全。)
不必创建笨拙的链接或不使用通配符,您可以创建存档,然后更改目录并附加到它(使用r
选项) 像这样:
tar cvf ~/archive.tar file* # make initial tarball
(cd folder2 && tar rvf ~/archive.tar file* ) # append others to it
(cd folder3/folder4 && tar -rvf ~/archive.tar file*) # and more...
请注意,我在子 shell 中执行上述操作以避免之后 cd
返回。
I have a following structure:
-folder1
-folder2
-file1
-file2
-folder3
-folder4
-folder5
-file3
-file4
使用 bash 我需要在实际目录 中创建一个 .tar 存档 ,它将包含 4 个文件(文件 1、文件 2、文件 3、文件 4).我尝试过的所有内容都会生成文件及其路径的存档。我需要的是 文件 的存档,其中必须包含:
file1
file2
file3
file4
简单的解决方案是创建硬 links 到 /tmp,然后从那里存档,像这样:
mkdir /tmp/allfiles
find /home/user/folder1 -type f | while read file
do
ln $file /tmp/allfiles
done
cd /tmp/allfiles
tar cvf /tmp/myarchive.tar *
rm /tmp/allfiles/*
rmdir /tmp/allfiles
请注意,hard link 仅在 /tmp 和 ~/folder1 在同一文件系统上时才有效。这只会使 links 而不会占用额外的磁盘空间。
您可以先删除 rm 命令。脚本中的类型可能会产生不良结果:-)。
在不创建任何临时目录的情况下尝试此操作:
find .type f | pax -wv -s '/.*\///g' -f file.tar
来自 man pax
:
pax — read and write file archives and copy directory hierarchies
由于tar
是用来存储目录结构的,如果你不想保留它们,你必须先删除它们...
为此,您可以创建临时目录以在一个 uniq 级别存储 symlinks:
tmpdir=$(mktemp -d /tmp/tardir-XXXXXX)
find $PWD -type f -exec ln -st $tmpdir {} +
cd $tmpdir
tar -chvf /tmp/myarchive.tar *
cd -
rm -fR $tmpdir
备注:
$PWD
强制find
到 link 到临时目录的整个路径。-h
tar
的选项告诉他存储指向的文件而不是 symlink。
如果您知道文件名及其目录,您可以使用 -C
/--directory
选项让 tar 在处理参数时更改其操作目录。
所以这个命令:
tar -cf files.tar.gz -C folder1/folder2 file1 file2 -C ../folder3/folder4 file3 file4
将在当前目录中创建 files.tar.gz
,其中只有文件。
如果需要,您可以通过一些脚本自动从 find
输出或类似内容创建必要的命令行参数。
(您不能在文件参数位置使用像 folder1/folder2/*
这样的 glob,因为这些文件名中的路径会导致 tar
找不到它们。您可以使用 $(ls folder1/folder2/)
在那个位置,但对于许多有效的文件名来说,这显然不安全。)
不必创建笨拙的链接或不使用通配符,您可以创建存档,然后更改目录并附加到它(使用r
选项) 像这样:
tar cvf ~/archive.tar file* # make initial tarball
(cd folder2 && tar rvf ~/archive.tar file* ) # append others to it
(cd folder3/folder4 && tar -rvf ~/archive.tar file*) # and more...
请注意,我在子 shell 中执行上述操作以避免之后 cd
返回。