2014-11-13 195 views
0

我想要使用以下腳本遍歷/ Volumes/Volume-B/Exchange中的所有子文件夾,並應用這些ACL和權限更改,但不會將其應用於/ Volumes/Volume -B/Exchange父文件夾。遍歷子文件夾並運行

某種循環,通過子文件夾循環就是我卡上...如何實現這種清潔大加讚賞

建議!

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

回答

0

只需使用一個簡單的for循環:

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

這不應該改變任何權限上DEST本身,而其子。

+0

是的,那正是我在找的,謝謝! – Dan

-1

你有沒有嘗試過這樣的:

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

這與-R開關應適用所有更改父目錄的內容一起。

+0

恐怕不行 - 我應該提到我想,已經......我相信chmod命令所需要的名字問題的文件夾其更改權限... – Dan

+0

奇怪的是,它適用於我。 (bash在Ubuntu上) – jmajnert

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字符的文件名可以正常工作。

0

如下你可以做到這一點沒有一個循環:

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