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'

関連情報