ディレクトリ内のファイルを探してターゲットにcpを送信しますが、サブディレクトリの親構造のみを保持します。

ディレクトリ内のファイルを探してターゲットにcpを送信しますが、サブディレクトリの親構造のみを保持します。

.statsこれは、ディレクトリの下でファイルを探し、ターゲットディレクトリにファイルを実行しますが、*/*long*/statscpディレクトリのみを保持する作業です。/*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/

おすすめ記事