2016-05-13 161 views
0

這是我想要做的:給定目錄「XYZ」,我希望能夠設置XYZ的方式,一旦有新的子目錄(「ABC」)創建它,默認情況下,該子目錄包含3個子(「1」,「2」,「3」)。例如:ls -la/ABC/XYZ /將顯示3個文件夾,而無需我手動創建這3個文件夾如何從命令行更改Linux/Unix中的目錄結構?

回答

0

使用inotify監視文件系統事件並執行相關操作時捕獲「在XYZ中創建Driectory ABC」事件。這是從http://onestraw.net/essay/inotify/

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <sys/inotify.h> 

#define MONITOR_PATH "/var/onestraw/" 
#define MONITOR_MASK IN_CREATE | IN_DELETE | IN_ACCESS | IN_MODIFY 

inline void _err(const char *str) 
{ 
    perror(str); 
    exit(1); 
} 

inline void inotify_loop(int fd) 
{ 
    char buf[4096]; 
    size_t len; 
    struct inotify_event *event; 
    while (1) { 
     len = read(fd, buf, sizeof(buf)); 
     if (len < 0) { 
      _err("read() failed"); 
     } 
     for (event = (struct inotify_event *)buf; 
      (char *)event < &buf[len]; 
      event = 
      (struct inotify_event *)((char *)event + sizeof(*event) + 
          event->len)) { 
      if (event->mask & IN_CREATE) 
       printf("add %s\n", event->name); 
      if (event->mask & IN_DELETE) 
       printf("delete %s\n", event->name); 
      if (event->mask & IN_ACCESS) 
       printf("access %s\n", event->name); 
      if (event->mask & IN_MODIFY) 
       printf("modify %s\n", event->name); 
     } 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    int fd; 

    if ((fd = inotify_init()) < 0) { 
     _err("inotify_init() failed"); 
    } 
    //if (inotify_add_watch(fd, argv[1], MONITOR_MASK) < 0) { 
    if (inotify_add_watch(fd, MONITOR_PATH, MONITOR_MASK) < 0) { 
     _err("inotify_add_watch() failed"); 
    } 

    inotify_loop(fd); 
    return 0; 
} 
0

樣品中爲了做到這一點從命令行,安裝inotify工具。

sudo apt-get install inotify-tools 

然後您可以使用以下命令監視創建事件的XYZ目錄。

while ret=$(inotifywait -e create /tmp/XYZ); do mkdir /tmp/XYZ/{1,2,3}; done 

只要任何目錄或文件在XYZ被創建,在同時塊的命令將被執行。在這種情況下,mkdir會創建更多的目錄。您可以根據您在塊中的要求添加進一步的檢查。

+0

謝謝阿西夫,我會盡快嘗試,似乎是一個堅實的解決方案! – EminSqa