循环遍历子文件夹并运行

时间:2014-11-13 22:11:44

标签: macos bash shell

我想使用以下脚本循环遍历/ Volumes / Volume-B / Exchange中的所有子文件夹并应用这些ACL和权限更改,但不将它们应用于/ Volumes / Volume-B /交换父文件夹。

在子文件夹中循环的某种循环是我被困的地方......

关于如何实现这一点的建议非常赞赏!

#!/bin/bash

PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH
DEST=/Volumes/Volume-B/Exchange
LOG=/var/log/fixperms-exchange.log


{
echo ""
echo "Begin Fixing perms on $DEST at `date`"
chmod -R +a "studiostaff allow list,add_file,search,delete,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,file_inherit,directory_inherit" "$DEST"
chmod -R +a "studiostaff inherited allow read,write,execute,delete,append,readattr,writeattr,readextattr,writeextattr,readsecurity" "$DEST"

chown -R padmin:staff "$DEST"
echo "Permissions fix complete at `date`"
echo ""

} >> $LOG 2>&1

4 个答案:

答案 0 :(得分:0)

只需使用简单的for循环:

for DIR in $DEST/*
do
    chmod -R +a ... $DIR
done

这不应该更改DEST本身的任何权限,只能更改其子项。

答案 1 :(得分:0)

无需循环浏览文件。递归地将ACL应用于文件层次结构就像使用find

一样简单
# Export environment variable
PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH

# Initialise timestamp & variables
dest=/Volumes/Volume-B/Exchange
serv_log=/var/log/fixperms-exchange.service.log
ts=$(date +%T_+%F);

# About to fix permissions
echo '[$ts] : about to fix permissions' >> $serv_log;

# Find all sub directories of parent and chown/chmod -R

find $dest/*  -type d -maxdepth 1 -mindepth 1 -exec chown -R padmin:staff {} \; -exec chmod -R +a "studiostaff allow list,..." {} \; -exec chmod -R +a "studiostaff allow read,..." {} \;

# Finished fixing permissions
echo '[$ts] : completed permissions task' >> $serv_log;

find找到$dest-type d -maxdepth 1 -mindepth 1)的所有直接子目录。对于每次调用实用程序,-exec utility [argument ...] {}man find)将被尽可能多的路径名替换。适用于名称中包含NUL字符的文件名。

答案 2 :(得分:0)

您可以在没有循环的情况下执行此操作:

chmod -R +a "..." /Volumes/Volume-B/Exchange/*

答案 3 :(得分:-1)

你试过这个:

DEST='/Volumes/Volume-B/Exchange/*'

这与-R开关一起应该对父目录的内容应用所有更改。