Linux-сервер создает символические ссылки из имен файлов - PullRequest
1 голос
/ 27 декабря 2011

Мне нужно написать сценарий оболочки для запуска в качестве задачи cron или, предпочтительно, при создании файла в определенной папке.

У меня есть папки incoming и outgoing (они будутиспользоваться для регистрации почты).Будут созданы файлы с кодами следующим образом ...

bmo-001-012-dfd-11 для исходящих и 012-dfd-003-11 для входящих.Мне нужно отфильтровать код проекта / клиента (012-dfd) и затем поместить его в папку в определенной папке проекта.

Папки проекта расположены в /projects и следуют формату 012-dfd.Мне нужно создать символические ссылки во входящих или исходящих папках проектов, что приведет к правильному файлу в общих папках incoming и outgoing.

/incoming/012-dfd-003-11.pdf -> /projects/012-dfd/incoming/012-dfd-003-11.pdf
/outgoing/bmo-001-012-dfd-11.pdf -> /projects/012-dfd/outgoing/bmo-001-012-dfd-11.pdf

Так что мои вопросы

  1. Как запустить скрипт при добавлении файла во входящую или исходящую папку
    1. Кроме того, есть ли какие-либо недостатки, связанные с запуском при модификации файла, по сравнению с выполнением задачи cron каждые 5 минут
  2. Как получить имя файла последних (с момента последнего запуска скрипта) файлов
  3. Как извлечь код из имени файла
  4. Как быЯ использую код для создания символической ссылки в нужной папке

РЕДАКТИРОВАТЬ: Что я в итоге сделал ...

while inotifywait outgoing; do find -L . -type l -delete; ls outgoing | php -R '
if(
    preg_match("/^\w{3}-\d{3}-(\d{3}-\w{3})-\d{2}(.+)$/", $argn, $m)
    && $m[1] && (file_exists("projects/$m[1]/outgoing/$argn") != TRUE)
){
    `ln -s $(pwd)/outgoing/$argn projects/$m[1]/outgoing/$argn;`;
}
'; done;

Это работает довольно хорошо - очисткатакже удалил символические ссылки (с find -L . -type l -delete), но я бы предпочел сделать это без дополнительных затрат на вызов php.Я просто еще недостаточно хорошо знаю bash.

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

Некоторые близкие ответы для вашей задачи:

  1. В linux используйте inotify , возможно, через один из инструментов командной строки или привязки языка сценариев .
  2. См. Выше
  3. Предполагая, что имя проекта можно извлечь, исходя из ваших примеров, позиционируя его (то есть, имя проекта не только следует строгому7-символьный формат, но то, что предшествует , что и в исходящем файле также делает):

    echo `basename /incoming/012-dfd-003-11.pdf` | cut -c 1-7
    012-dfd
    echo `basename /outgoing/bmo-001-012-dfd-11.pdf`| cut -c 9-15
    012-dfd
    
    • mkdir -p /projects/$i/incoming/ создает каталог /projects/012-dfd/incoming/, еслиi = 012-dfd,
    • ln -s /incoming/foo /projects/$i/incoming/foo создает символическую ссылку из последнего аргумента на ранее существовавший прежний файл /incoming/foo.
1 голос
/ 27 декабря 2011
How would I make my script run when a file is added to either incoming or outgoing folder
    Additionally, is there any associated disadvantages with running upon file modification compared with running as cron task

каждые 5 минут

Если 5-минутная задержка не является проблемой, я бы пошел на задание cron (это проще и более гибко)

Как мне получить имя файла последних (с момента последнего запуска скрипта) файлов

Если ваш скрипт запускается каждые 5 минут, то вы можете сказать, что все файлы, созданные за это время (и сейчас - 5 минут), являются новыми, используя команду ls или find Вы можете перечислить эти файлы.

Как мне извлечь код из имени файла

Вы можете использовать команду sed

Как бы я использовал код для создания символической ссылки в нужной папке

Когда у вас есть нужные имена файлов, вы можете использовать команду ln -s для создания символической ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...