我正在尝试编写一个小的 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/