디렉터리에서 파일을 찾고 대상으로 cp를 보내지만 하위 디렉터리의 상위 구조만 유지합니다.

디렉터리에서 파일을 찾고 대상으로 cp를 보내지만 하위 디렉터리의 상위 구조만 유지합니다.

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

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/

관련 정보