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

bash script to recursively run commands on directories depending on the pattern of the directory name

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

换句话说,这就是我想做的,但不知道如何在 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然后删除/家/.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

还没有测试copy/move部分;你应该先看看 echo,如果这给了你,你想要什么。

#!/bin/bash
# handles directory names with spaces
IFS='
'
for BACKUPDIR in $(find . -depth -type d -name ".wh..wh.*")
do
    BASE=$(dirname "${BACKUPDIR}")
    LASTPART=$(basename "${BACKUPDIR}")
    D1=${LASTPART#.wh..wh.}
    D2=${D1%.*}

    if [ -d "${BASE}/${D2}" ]
    then
       echo copying from "${BACKUPDIR}" to "${BASE}/${D2}"
       # prevents deleting if the cp command fails
       if cp -a --backup=numbered "${BACKUPDIR}/"* "${BASE}/${D2}"
       then
           echo deleting "${BACKUPDIR}"
           rm -rf "${BACKUPDIR}"
       fi
    else
        echo moving "${BACKUPDIR}" to "${BASE}/${D2}"
        mv "${BACKUPDIR}" "${BASE}/${D2}"
    fi
done