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'

관련 정보