bash脚本以递归方式在目录上运行命令,具体取决于目录名称的模式

时间:2015-02-02 15:06:25

标签: linux bash

我正在尝试编写一个小的bash脚本,以帮助在恢复之前将一些恢复的目录/文件排序回原始文件结构。简而言之,我已经恢复了使用aufs union文件系统汇集的磁盘池,在恢复已删除的目录/文件之后,我注意到在很多目录中都有名为" .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

2 个答案:

答案 0 :(得分:0)

以下是仅使用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

Haven未对复制/移动部分进行测试;你应该首先看到回声,如果这给你,你想要什么。

答案 1 :(得分:0)

#!/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