我需要从 Debian 10 pod 复制包含(Windows 风格)反斜杠的文件。我GNU tar 1.30
在使用反斜杠归档文件时遇到问题:
docker run --rm -it debian:10 bash
例如,在容器内运行:
touch C\:\\LOG_DOTNET\\1
touch C\:\\LOG_DOTNET\\2
带有反斜杠的文件:
ls -l C\:*
-rw-r--r-- 1 root root 0 Mar 14 17:20 'C:\LOG_DOTNET\1'
-rw-r--r-- 1 root root 0 Mar 14 17:20 'C:\LOG_DOTNET\2'
尝试使用tar
通配符进行存档:
tar cvf a.tar C\:*
tar: C\:\\LOG_DOTNET\001: Cannot stat: No such file or directory
tar: C\:\\LOG_DOTNET\002: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
尝试find
打印NUL
字符并使用xargs
:
find . -name C\:\* -print0 | xargs -0 tar cvf a.tar
tar: ./C\:\\LOG_DOTNET\002: Cannot stat: No such file or directory
tar: ./C\:\\LOG_DOTNET\001: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
尝试单引号每一行:
find . -name C\:\* | sed "s/'/'\\\\''/g; s/^/'/; s/$/'/" | xargs tar cvf a.tar
tar: ./C\:\\LOG_DOTNET\002: Cannot stat: No such file or directory
tar: ./C\:\\LOG_DOTNET\001: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
我也不明白为什么\00
会出现而不是\\
(似乎是我的问题的原因)。
如果您提供kubectl cp
或kubectl exec
命令复制此类文件,则会有好处。 :-)
答案1
我在这里找到了答案:超级用户问题
find . -name C\:\* -print0 | tar --null -T - -cf a.tar
来自 tar 手册:
--null Instruct subsequent -T options to read null-terminated names verbatim (disables special handling of
names that start with a dash).
对于-T,我们可以使用标准输入作为源。 => 测试:
find -name 'C:*' -print0 |tar --null -T - -cf a.tar
tar tf a.tar
./C:\\LOG_DOTNET\\2
./C:\\LOG_DOTNET\\1