linux - bash 脚本根据目录名称的模式在目录上递归运行命令

标签 linux bash

我正在尝试编写一个小的 bash 脚本来帮助将一些恢复的目录/文件排序回恢复之前的原始文件结构。简而言之,我恢复了使用 aufs 联合文件系统合并的磁盘池,在恢复已删除的目录/文件后,我注意到在很多目录中都有名为“.wh..wh.original_dir_name.4_random_characters”的目录,例如“.wh..wh.Images.1E7W”。该目录将位于实际“Images”目录所在的同一目录中。这些 .wh 目录被称为空白,通常由 aufs 文件系统在删除操作期间创建,但我注意到其中有很多可恢复的文件/目录,但我想将它们重新集成到正常结构中。

换句话来说,这就是我想做的,但不知道如何在 bash 脚本中将其拼凑在一起。

当我找到一个名为 .wh..wh 之类的目录时,我需要递归遍历该结构。然后我需要解析目录的真实名称,如果该目录已存在于同一目录中则执行 cp -r --backup=numbered .wh..wh./* real_directory_name/然后删除 .wh..wh 目录,或者如果该目录不存在,则只需使用 mv 重命名该目录即可命令。我假设我会使用find命令遍历该结构,但再次不确定如何将其拼凑在一起。任何帮助都会很棒。

这里是一个示例文件结构来澄清事情:

    /home/
    /home/.wh..wh.Images.67TY/
    /home/.wh..wh.Images.67TY/Camping/
    /home/Images/
    /home/Images/Camping/

在上面的示例中,我想使用 cp命令将/home/.wh..wh.Images.67TY 的内容复制到/home/Images,然后删除/home/.wh..wh.Images.67TY

最佳答案

这是一个仅使用 bash 参数扩展的解决方案:

#!/bin/bash

for BACKUPDIR in $(find . -type d -name ".wh..wh.*")
do
    BASE=$(dirname "${BACKUPDIR}")

    LASTPART=$(basename "${BACKUPDIR}")
    D1=${LASTPART#.wh..wh.}
    D2=${D1%.*}

    if [ -d "${BASE}/${D2}" ]
    then
         cp -a "${BACKUPDIR}/"* "${BASE}/${D2}"
    else
         mv "${FILEPATH}" "${BASE}/${D2}"
    fi

done

尚未测试复制/移动部分;你应该首先用 echo 看看,如果这给了你你想要的东西。

关于linux - bash 脚本根据目录名称的模式在目录上递归运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28280665/

相关文章:

linux - 如何使用 while read line 将文件名打印到文本文件的每一行

javascript - 使用 javascript 读取 bash 输出

c - 重新启动 fork 进程中的线程

c - 我如何在 Linux 上覆盖根文件系统?

linux - 删除文件中 bash 中特定参数的重复值

bash 脚本无法读取第一行

xml - 在bash中生成XML,需要一些有效的想法

c++ - 使用 C++ 中的 Linux 上的 Qt 连接到 Oracle DB

linux - 如何让busybox1.23.2编译成功?

python - 检测停止进程Python