[英]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.