Как мне отличить 2 папки по имени файла, но только по началу имен файлов, используя zsh?

@mosvy уже дал вам хороший ответ.

Мораль этой истории такова: :использование переменных оболочки для хранения данных, длина которых не проверена, не является хорошей идеей. Также не рекомендуется использовать переменные оболочки или оболочки вообще, потому что это ненормальные языки программирования. Однако, если вам абсолютно необходимо сохранить содержимое в переменной оболочки, вы также можете попробовать этот сумасшедший трюк, представленный шагами -и -шагами :

.

Создайте временный файл со всем содержимым с помощью замены процесса. Положитесь на тот факт, что встроенные в оболочку -ins освобождены от обычного ограничения аргументов подпроцесса.

awk -v patternFile=<( printf "$encStr" )

Используя громоздкие способы AWK (это типичный инструмент Unix, ориентированный на строки -, в конце концов ), считывает весь временный файл в переменную AWK «содержимое», сначала разбивая его на строки, а затем реконструируя его. используя катетерацию строк, добавляя любые новые строки, которые были удалены при разделении.

awk -v substitutionFile=<( printf "$encStr" ) 'BEGIN {while ((getline line <substitutionFile) > 0) { contents = contents line "\n"}}'

Затем обычным способом, ориентированным на строку -, который вы уже использовали для определения токенов, подлежащих замене в файле шаблона, выполните замену:

awk -v substitutionFile=<( printf "$encStr" ) 'BEGIN {while ((getline line <substitutionFile) > 0) { substitutionString = substitutionString line "\n"}} {gsub("REPLACECONTENT", substitutionString, $0); print}' /path/tomytemplate > output.tmp

Приведенное выше решение ужасно... Но по меркам *никсовских шеллов, недостаточно уродлив! Если вы уже используете оболочку *nix, почему бы не пойти до конца и не использовать heredoc? Таким образом, вы подвергаетесь меньшему риску того, что команда printf будет переопределена, например. функция (в моей системе, сбой в производственном коде :D ), но вызывает риск вашего файла, содержащего разделители heredoc:

awk -v substitutionFile=<( cat <<HOPEFULLY_UNIQUE_HEREDOC_DELIMITER
$encStr
HOPEFULLY_UNIQUE_HEREDOC_DELIMITER
) 'BEGIN {while ((getline line <substitutionFile) > 0) { substitutionString = substitutionString line "\n"}} {gsub("REPLACECONTENT", substitutionString, $0); print}' /path/tomytemplate > output.tmp

Обратите внимание, что подстановка переменных в heredoc считается заключенной в кавычки, поэтому $encStrне следует заключать в кавычки, иначе ваша строка подстановки также будет содержать кавычки! Это 1749203 -правило замены оболочки. В других контекстах главное правило простое :вы используете двойные кавычки как для подстановки переменных, так и для команд, или вы умрете.

В этом случае не имеет значения, что catне является встроенным -, так как его стандартный ввод перенаправляется только во временный файл, созданный heredoc, который сам по себе не имеет такого ограничения длины, поскольку нет никакого аргумента.

1
10.11.2020, 16:44
1 ответ

Вы можете использовать ${a:|b}массив -оператор вычитания:

dir1=/some/dir
dir2=/some/other/dir

a=($dir1/*[[_-]*(N:t)) # [t]ail of every file with at least one -, [ or _
b=($dir2/*[[_-]*(N:t))

a=(${a%%[[_-]*}) # strip [*, _* or -* suffix
b=(${b%%[[_-]*})

print -r in $dir1 and not in $dir2:
print -rC1 -- ${a:|b}
print -r in $dir2 and not in $dir1:
print -rC1 -- ${b:|a}
3
18.03.2021, 22:51

Теги

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