.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/