我使用来自的脚本删除目录,除非由符号链接指向
在使用脚本删除目录之前如何检查目录的访问权限和可用性?在某些情况下,dir 可能在其中一台主机中不可用。我需要在删除之前检查目录的可用性和访问权限。我就这样尝试过。
dirrm ()
{
for topdir in /dir1 /dir2; do
for dirpath in "$topdir"/main/app/*/; do
if [ -e "$dirpath/log.xml" ] && ! [ "$dirpath" -ef "$topdir"/ln/app ]
then
printf 'Would remove "%s"\n' "$dirpath"
# rm -rf "$dirpath"
fi
done
done
}
if ! test /dir1/
then
printf 'No access to dir1\n'
else
dirrm
fi
谢谢
答案1
为了能够扩展"$topdir"/main/app/*/
全局,您需要:
- 搜索访问权限
$topdir/
(您可以使用 进行检查[ -x "$topdir/" ]
) - 搜索访问
"$topdir"/main/
. - 搜索并读取访问
"$topdir"/main/app/
. - 对于符号链接中的文件
"$topdir"/main/app
,您还需要对必须遍历的任何目录进行搜索访问才能到达符号链接的最终目标。
为了能够检查"$dirpath/log.xml
和"$topdir"/ln/app
是同一文件的两个路径,您需要搜索访问权限"$topdir"/ln
和 必须遍历的目录(如果它们是符号链接)。
为了能够做到这一点rm -rf "$topdir"/main/app/some-subdir/
,首先要注意 ifsome-subdir
是一个符号链接,这将清空链接指向的目录,并且可能会也可能不会删除符号链接本身或其链接到的目录,具体取决于实现rm
。
在任何情况下,您都需要对"$topdir"/main/app
and 进行写访问,除非some-subdir
为空,否则您还需要对它进行搜索、读和写访问(以及递归地对任何非空子目录)。另请注意,该t
钻头可能会增加复杂性。
由于您需要 的读取、写入和搜索权限"$topdir"/main/app/
,因此只需添加:
dirrm ()
{
for topdir in /dir1 /dir2; do
appdir="$topdir/main/app/"
if [ ! -w "$appdir" ] || [ ! -r "$appdir" ] || [ ! -x "$appdir" ]; then
printf >&2 '%s\n' "I don't have the necessary access to $appdir"
return 1
fi
...
将是一个好的开始。