查找目录下的文件并cp到目标但只保留子目录父结构

查找目录下的文件并cp到目标但只保留子目录父结构

这是我的任务.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.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/

相关内容