我想打包一些 Python 文件并将其通过服务器发送。我愿意:
find /some/path -iname "*.py" -exec tar czfv python_files.tar {} +
其次是:
pv python_files.tar| ssh some_user@some_server 'cat | tar xz -C /some/path/on/server'
不幸的是,当我在服务器上使用 SSH 时,我看到满的目录结构已通过服务器发送,我发现我的 python 文件如下:
/some/path/on/server/complicated/sub/directory/some_file.py
/some/path/on/server/another/complicated/sub/directory/some_file2.py
我想要的是我的文件位于根目录:
/some/path/on/server/some_file.py
/some/path/on/server/some_file2.py
缺失的部分是什么?
答案1
根据 man tar (长读)
--transform=EXPRESSION, --xform=EXPRESSION
使用 sed 替换 EXPRESSION 来转换文件名。
我用了
find . -name \*.py -print | xargs tar cf tmp7/test-py.tar --transform=s:./.*/:: -
所有文件都位于同一级别。
sed表达式
s:./.*/::
:(贪婪)./.*/
什么都不替换。
奖金:
find . -name \*.py -print | sed -e s:./.*/:: | awk 'a[$1]++ { print ; }'
将打印重复的文件名。
答案2
与用户 Archemar 的解决方案类似,仅在提取 tar 时应用。.*/
用空字符串替换。
pv python_files.tar| ssh some_user@some_server 'cat | tar xz --transform=s,.*/,, -C /some/path/on/server'