sed表达式

sed表达式

我想打包一些 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'

相关内容