跳过特定文件模式时进行 Tar 复制

跳过特定文件模式时进行 Tar 复制

目标:我正在尝试创建一个命令来复制除以“.”开头的所有文件之外的所有文件。或者 ”。_”

顺便说一句,我正在使用 Arch Linux 5.19 和 ZSH

场景:我有一个几乎已满的 1TB 硬盘,其中包含合法文件以及以“.”开头的文件和文件夹的基本副本。和 ”。”。例如:“.DS_Store”和“.$RECYCLING_BIN”。我想在清理和删除这些文件类型之前复制并备份该硬盘驱动器的所有内容。然而,由于创建了如此多的文件类型,因此复制过程需要非常长的时间。我想在复制时基本上跳过这些文件,只复制我想要保留的文件。

我已经尝试过这些命令#1

tar cf --exclude='/.*' - . | pv | (cd ~/test2; tar xf -)

我得到这个输出

tar: --exclude=/.*: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now
0.00 B 0:00:00 [0.00 B/s] [>                                                             ]0%

和这个命令#2

tar cf -X .* - . | pv -s $(du -sb ~/test1 | awk '{print $1}') | (cd ~/test2; tar xf -)

输出

tar: -: Cannot stat: No such file or directory
tar: ./-X: file is the archive; not dumped
tar: Exiting with failure status due to previous errors
0.00 B 0:00:00 [0.00 B/s] [>                                                             ]0%            
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors

答案1

正确的命令是

tar --exclude='**/.*' -cf - . | pv -s $(du -sb ~/test1 | awk '{print $1}') | (cd ~/test2; tar xf -)
  1. 正如 @doneals24 在之前的评论中发布的那样,该-f选项是创建的存档的名称 - 因此您可以指示破折号作为文件名

  2. --exclude选项必须遵循此格式\*\*/.*才能使模式有效

相关内容