сброс счетчика uid

Я согласен с тем, что gawk4 или perl --или python --являются лучшим решением этой проблемы. Тем не менее, для дальнейшего использования и назидания, можно сделать ваш сценарий оболочки лучше или, по крайней мере, менее плохим.

Во-первых и самое главное, вам не нужно много раз запускатьawkилиcutдля разделения полей; пока ваши поля разделены одним символом, оболочка readможет сделать это за вас. Я не уверен, почему вы указали разделитель для awkкак [=\|], что означает либо знак равенства -, либо vert -правило -, также известное как -, канал, когда ваши данные из команды sqlite3, которая использует только правило vert -и никогда не использует знак равенства -. Таким образом, вы хотите начать с чего-то вроде:

 while IFS='=|' read var1 var2 var3 var4 var5; do... done <filelist1
 # change IFS='|' if you don't actually need to split on equal-sign 

 # could skip the first temp file, if you don't need it for anything else,
 # with either a pipeline (any shell):
 sqlite3... 'select...' | while IFS.. read...; do... done
 # or process substitution (only bash and some others):
 while IFS.. read...; do... done < <(sqlite3... 'select...')

Вероятно, лучше добавить опцию -rк read; данные вашего примера не содержали обратной косой черты, но если бы фактические данные когда-либо были, они были бы повреждены без -r. Конвейерный подход немного более переносим, ​​но в целом немного более рискован, потому что он может не работать, когда нужно установить var (s )или внести другие изменения оболочки (s ), например cdвнутри цикл , которые сохраняются после цикла --, но не вы.

Во-вторых, вам не нужно несколько проходов и (так много )промежуточных файлов, если вы объединяете логику:

while IFS.. read -r var1 var2 var3 var4 var5; do 
    if  [ "$var4" == 0 ]; then var1="/Users/spazek/Pictures/Fotos Library.photoslibrary/Masters/$var1"
    elif [ "$var5" == "macOS" ]; then var1="/$var1"
    else echo var1="/Volumes/$var5/$var1; fi
    test -f "$var1" || echo "Name = $var3 \n Path = $var1 \n"
done >~/Desktop/MissingPhotos.txt <filelist1 
# or options to avoid filelist1 per above

Наконец, я бы предложил использовать более осмысленные имена переменных, такие как path name idвместо var1и т. д., но это имеет значение только для людей, читающих сценарий, таких как вы через несколько месяцев; компьютеру все равно. Вы можете свободно выбирать имена переменных в нижнем регистре для переменных оболочки; по соглашению окружение переменные (т. е. переменные оболочки, которые экспортируются в программы, и дочерние оболочки )пишутся в верхнем регистре, но тогда вы должны быть немного осторожны, чтобы не конфликтовать с некоторыми специальными созданными переменными/окружениями. -в оболочке или стандартизировано для всей системы.

0
03.01.2020, 13:42
1 ответ

Из справочной страницы:

The UID defaults to  the  next  available
(unique)  number  above  the  highest  number  currently
assigned. For example, if UIDs 100,  105,  and  200  are
assigned,  the next default UID number will be 201.
1
28.01.2020, 02:38

Теги

Похожие вопросы