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