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