2012-06-07 3 views
2

Я очень новичок в этом и искал ответы на свой вопрос, но не нашел того, что я понимаю, как реализовать. Любая помощь будет принята с благодарностью.Как пропустить некоторые файлы в моем скрипте?

У меня есть сценарий:

FILE$=`ls ~/Desktop/File_Converted/` 
mkdir /tmp/$FILE 
mv ~/Desktop/File_Converted/* /tmp/$FILE/ 

Так что я могу использовать Applescript сказать, когда файл удаляется в этом рабочем столе папку, создать временную папку, переместить туда файл и делать другие вещи. Затем я удаляю временную директорию. Это хорошо, насколько это возможно, но проблема в том, что если другой файл будет удален в каталог File_Converted, прежде чем я буду делать материал в файле, в котором я сейчас работаю, он изменит значение переменной $ FILE до того, как скрипт будет завершил работу над текущим файлом.

Что я хотел бы сделать, это использовать переменную, где переменная, скажем, $ FILE1. Я проверяю, определяет ли $ FILE1 и, если нет, используйте его. Если он определен, попробуйте $ FILE2 и т. Д. В конце концов, когда я закончил, я хочу вернуть переменную, так что $ FILE1 снова вернется к нулевому значению, и следующий файл, который упал в папку File_Converted, может использовать его еще раз.

Любая помощь была бы принята с благодарностью. Я новичок в этом, поэтому не знаю с чего начать.

Спасибо!

Dan

+0

Звучит как LIFO. Нет, я не знаю, как это сделать в bash. – starbolin

+0

Переменные не изменяют свои значения после их назначения, не будучи явно переназначенными - добавление нового файла не будет изменять то, что glob уже имеет в переменной, - и также уникально для выполнения одного сценария (так что два копии одного и того же сценария могут иметь два разных значения в '$ FILE1', они не изменят друг друга). Теперь, если будет использоваться точный каталог _, который является общим, то это будет иметь больше смысла. –

+0

Ваш AppleScript, inotify, cron job или что-то еще может начать скрипт. Если вы используете mktemp, вам не придется беспокоиться о параллельных запусках, сбивающих друг друга. –

ответ

-1

То, что вы описываете классический состояние гонки,, в которой не ясно, что одна операция завершится до начала конфликтует операции. Их нелегко обрабатывать, но вы так много узнаете о сценариях и программировании, обратившись к ним так, что это стоит того, чтобы это сделать, даже ради обучения.

Я бы порекомендовал вас начать обзорную страницу lockfile или flock. Попробуйте несколько экспериментов. Похоже, что у вас, вероятно, есть правильная способность к этому, потому что вы задаете именно правильные вопросы.

Кстати, я подозреваю, что вы хотите убить $ в

FILE$=`ls ~/Desktop/File_Converted/` 

в Кстати, @CharlesDuffy правильно отмечает, что «с помощью ls в сценариях свидетельствует о чем-то, что делается неправильно и само по себе. Смотрите mywiki.wooledge.org/ParsingLs и mywiki.wooledge.org/BashPitfalls. " Один подозревает, что предложенное упражнение lockfile прояснит обе точки, хотя, вероятно, вам понадобится несколько часов, чтобы пройти через него.

+1

Это более того - использование ls в скриптах свидетельствует о том, что что-то делается неправильно и само по себе. См. Http://mywiki.wooledge.org/ParsingLs и http://mywiki.wooledge.org/BashPitfalls –

+0

@CharlesDuffy: Спасибо. Мой пересмотренный ответ теперь отражает ваш комментарий. – thb

+0

Спасибо, ребята! Запуск человека в файле блокировки сейчас. –

2

Ваш вопрос немного трудно разобрать, но я думаю, что вы на самом деле не понимая shell globs или looping constructs. Шаблоны расширяются в зависимости от того, что есть сейчас, а не то, что может быть раньше или позже.

DIR=$(mktemp -d) 
mv ~/Desktop/File_Converted/* "$DIR" 
cd "$DIR" 
for file in *; do 
    : # whatever you want to do to "$file" 
done 
+0

Спасибо за ответы! Если я верну вам парни, сценарий можно запустить, отбросив файл, и экземпляр переменной для этого экземпляра скрипта не изменится, если в папку будет сброшен другой файл, а другой экземпляр скрипта стартует , Это меняет ситуацию. Спасибо! –

2

Вам не нужен LIFO - несколько копий сценария, запускаемого для разных событий, не будут иметь конфликта над именами переменных. Что они будет конфликтующим является общим временным каталогам, и вы должны использовать mktemp -d для создания временного каталога с новым, уникальным и гарантированным неконфликтным именем каждый раз, когда запускается ваш скрипт.

tempdir=$(mktemp -t -d mytemp.XXXXXX) 
mv ~/Desktop/File_Converted/* "$tempdir" 
cd "$tempdir" 
for f in *; do 
    ...whatever... 
done 
Смежные вопросы