일부 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'