繁体   English   中英

使用 bash 命令将文件从子文件夹复制到另一个

[英]Using bash command to copy files from a subfolder to another

我有以下结构:

.
├── dag_1
│   ├── dag
│   │   ├── current
│   │   └── deprecated
│   └── sparkjobs
│       ├── current
│       |    └── spark_3.py
│       └── deprecated
│           └── spark_1.py
│           └── spark_2.py
├── dag_2
│   ├── dag
│   │   ├── current
│   │   └── deprecated
│   └── sparkjobs
│       ├── current
│       |    └── spark_3.py
│       └── deprecated
│           └── spark_1.py
│           └── spark_2.py

我想创建一个仅获取当前 spark 作业的新文件夹,我预期的 output 文件夹是:

.
├── dag_1
|    └── spark_3.py
├── dag_2
     └── spark_3.py

我试过使用

find /mnt/c/Users/User/Test/ -type f -wholename "sparkjob/current" | xargs -i cp {} /mnt/c/Users/User/Test/output/

尽管我的脚本没有写入文件并且没有返回任何错误。 我该如何解决这个问题?

使用这个, install命令获取输入文件并将其复制到另一个目录结构,必要时创建整个目录树作为mkdir -p透明地:

(需要在-wholename中加通配符*才能有效查找文件)

find . -type f -wholename "*/sparkjob/current/*" -exec bash -c '
    dir=${1#./} dir=${dir%%/*} file=${1##*/}
    install -D "$1" "./$dir/$file"
' bash {} \;

完成的示例:

install -D ./dag_2/sparkjob/current/spark_3.py ./dag_2/spark_3.py
install -D ./dag_1/sparkjob/current/spark_3.py ./dag_1/spark_3.py

源路径是一个例子,如果更长,没问题。

我想你正在寻找这样的东西:

cd /mnt/c/Users/User/Test
for src in ./*/sparkjobs/current; do
  dest=output/${src%/*/*}
  echo cp -R "$src" "$dest"
done

如果 output 看起来不错,则丢弃echo

你会想要做的:

mkdir ../new_folder
find . -type f \
       -path '*/sparkjobs/current/*' \
       -exec sh -c 'f=$1
                    new=${f/sparkjobs\/current\//}
                    dest="../new_folder/$(dirname "$new")"
                    mkdir -p "$dest"
                    cp -v "$f" "$dest"' sh '{}' \;
‘./dag_1/sparkjobs/current/spark_3.py’ -> ‘../new_folder/./dag_1/spark_3.py’
‘./dag_2/sparkjobs/current/spark_3.py’ -> ‘../new_folder/./dag_2/spark_3.py’

首先,您应该通过删除|之后的所有内容来检查find返回的内容 . 你会看到find没有找到任何文件。 原因:

  • 顾名思义, -wholename匹配全名,所以需要*/sparkjob/current/*
  • 根据您的tree output,该文件夹未命名为sparkjob而是sparkjobs

我会从这样的事情开始:

find /mnt/c/Users/User/Test/ -type f -wholename "*/sparkjobs/current/*" -print0 | while IFS= read -r -d '' file; do
    echo mv "$file" "$(realpath "$(dirname "$file")"/../..)"
done

我添加了一个echo ,这样你就可以检查所有路径和命令是否正确。

您可能希望以简单性换取性能。 如果性能很重要(许多文件或频繁运行),请参阅https://mywiki.wooledge.org/BashFAQ/001

看起来很简单。

for d in $old_loc/dag_*
do mkdir -p "$new_loc/${d##*/}"
   cp "$d"/sparkjobs/current/spark_*.py "${d##*/}"
done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM