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

umuewwlo  于 2023-01-08  发布在  Linux
关注(0)|答案(5)|浏览(257)

我有以下结构:

.
├── 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作业,我期望的输出文件夹是:

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

虽然我的脚本没有写文件,也没有返回错误。我该如何解决这个问题?

67up9zun

67up9zun1#

我觉得你在找这样的东西:

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

如果输出看起来不错,则删除echo

0ve6wy6x

0ve6wy6x2#

使用install命令获取输入文件并将其复制到另一个目录结构中,如有必要,透明地创建整个目录树mkdir -p
(you需要在-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

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

bxjv4tth

bxjv4tth3#

您将需要执行以下操作:

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’
2exbekwf

2exbekwf4#

首先,你应该检查find返回什么,删除|之后的所有内容。你会发现find没有找到任何文件。

  • 顾名思义,-wholename与整个名称匹配,因此您需要*/sparkjob/current/*
  • 根据您的tree输出,文件夹的名称不是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

vs91vp4v

vs91vp4v5#

这看起来很简单。

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

相关问题