いくつかの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'