![디렉터리에서 파일을 찾고 대상으로 cp를 보내지만 하위 디렉터리의 상위 구조만 유지합니다.](https://linux55.com/image/175267/%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%97%90%EC%84%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%B0%BE%EA%B3%A0%20%EB%8C%80%EC%83%81%EC%9C%BC%EB%A1%9C%20cp%EB%A5%BC%20%EB%B3%B4%EB%82%B4%EC%A7%80%EB%A7%8C%20%ED%95%98%EC%9C%84%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%9D%98%20%EC%83%81%EC%9C%84%20%EA%B5%AC%EC%A1%B0%EB%A7%8C%20%EC%9C%A0%EC%A7%80%ED%95%A9%EB%8B%88%EB%8B%A4..png)
.stats
이것은 디렉토리 아래에서 파일을 찾고 */*long*/stats
대상 cp
디렉토리에 파일을 실행하지만 상위 디렉토리만 유지하는 작업입니다 . /*long*/stats
예 */*long*/stats
: cp foo/긴/stats/file.stats를 대상으로/긴/stats/file.statistics
나는 노력했다
find */*long*/stats -name '*.stats' -exec cp --parents \{} target/ \;
*/*long*/stats
대상에 복사됩니다 .
나는 노력했다
find */*long*/stats -name '*.stats' -exec cp --parents -maxdepth 2 \{} target/ \;
작동하지 않습니다.
누구든지 도와줄 수 있나요?
답변1
예를 들어, 복사하려는 경우 foo/XlongY/stats/a/b/c/file.stats
다음을 수행할 수 있습니다( 또는 를 사용하고 GNU / 를 가정).target/a/b/c/file.stats
bash
zsh
find
cp
target=$PWD/target
find ./*/*long*/stats -name '*.stats' -type f -printf '%H\0%P\0' |
while
IFS= read -rd '' dir &&
IFS= read -rd '' file
do
(cd "$dir" && exec cp --parents -- "$file" "$target/")
done
또는
target=$PWD/target
for dir in ./*/*long*/stats/; do
(
cd "$dir" &&
exec find . -name '*.stats' -type f -exec cp --parents -t "$target" {} +
)
done
또는 다음을 사용하여 zsh
:
zmodload zsh/files # makes mkdir and cp builtin to speed things up
mkcp() { mkdir -p -- "$2:h" && cp -- "$@"; }
zmv -P mkcp '*/*long*/stats/(**/)(*.stats)(#qD.)' 'target/$1$2'
이 방법은 파일 이름 충돌을 방지하지만 디렉터리 메타데이터는 복사하지 않습니다.
pax
또는 (귀하의 지원을 가정하여 -0
) 사용할 수 있습니다
find ./*/*long*/stats -name '*.stats' -type f -print0 |
pax -0 -rwpe -'s|^\./[^/]*/[^/]*/stats/||' target/