这是我的任务.stats
在目录下查找文件*/*long*/stats
并将cp
文件执行到目标目录,但仅保留父目录,/*long*/stats
例如*/*long*/stats
: cp foo/长的/stats/file.stats 到目标/长的/统计/文件.统计
我试过
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
到,您可以这样做(使用or ,并假设 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/