колотить/окружать расширение пути за mkdir, затронуть и т.д.?

Один путь мог быть:

sed '/^DESCRIPTION$/,/^[^ ]/!d' <(man cat) | head -n -1 > cat-man

Отметьте ту отрицательную величину head не POSIX.

2
19.08.2014, 13:26
3 ответа

Это не работает, потому что оболочка пытается развернуть всю строку */test, которая еще не существует. По умолчанию строка затем расширяется сама по себе. Если вы используете Bash, вы можете посмотреть на различные опции globbing, чтобы работать с ними так, как вы хотите.

0
27.01.2020, 21:50

То, что вы, возможно, упускаете - с которым у многих возникают проблемы, особенно если у них есть опыт работы с другими операционными системами до того, как они перейдут на * nix - это то, что во многих других ОС обычно передаются подстановочные знаки в командной строке к команде обрабатывать так, как считает нужным. Например, в командной строке Windows

rename *.jpeg *.jpg

, в то время как в * nix, чтобы упростить работу программиста (ов) отдельных команд (например, mv ), подстановочные знаки (если они не заключены в кавычки или экранированы) обрабатываются оболочкой, способом, не зависящим от интерфейса и функциональности команды, для которой подстановочные знаки являются аргументами. Большинство программ, которые принимают имена файлов в качестве аргументов командной строки, ожидают, что эти файлы существуют. (да, mkdir и touch - исключения из этого правила, а также mkfifo , mknod и, частично, cp , ln , mv и переименовать ; а есть наверное другие), поэтому оболочке не имеет смысла расширять подстановочные знаки к именам несуществующих файлов. А для оболочки (и под этим я подразумеваю каждую оболочку - Bourne, bash, csh, fish, ksh, zsh и т. Д.), Чтобы обрабатывать исключения по-разному. вероятно, было бы слишком хлопотно.


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

touch {red,orange,yellow,green,blue,indigo,violet}/rgb.txt

Более общее решение:

sh -c 'for arg do mkdir -- "$arg"/test; done' -- *

Жиль помог мне найти другой способ сделать это в bash.

benbradley=(*)
mkdir "${benbradley[@]/%//test}"

Очевидно, benbradley здесь просто идентификатор; вы можете использовать любое имя (например, любая буква). Мне потребовалось несколько попыток, чтобы понять это правильно, поэтому позвольте мне разбить его:

  • идентификатор = значение создает (скалярную) переменную с именем идентификатор (если он еще не существует) и присваивает ему значение value . Например, G = Мужчина . Вы можете ссылаться на скалярную переменную с помощью $ идентификатора ; например, $ G или, что более безопасно, как $ { идентификатор } . Например, $ Gage и $ Gilla могут быть неопределенными, но возраст $ {G} равен Управлять , а $ {G} illa - Манилла .
  • идентификатор = ( значение 1 значение 2 ) создает переменную массива с именем идентификатор (если он еще не существует) и присваивает ему перечисленные значения. Например,
       спектр = (красный оранжевый желтый зеленый синий индиго фиолетовый) 
    или
       all_text_files = (*. Txt) 
    $ name будет ссылаться на первый элемент (и поэтому бесполезен). Вы можете ссылаться на произвольный элемент как $ { name [ индекс ]} ; например, $ {спектр [0]} красный и $ {спектр [4]} - синий . И вы можете использовать $ { name [@]} и $ { name [*]} для ссылки на весь массив.

Итак, вот оно по частям:

       "$ {benbradley [@] /% / / test}" 
  • $ { параметр / шаблон / строка } расширяет параметр $ { } и заменяет самое длинное совпадение из паттерна со строкой .
  • Если шаблон начинается с # , он должен соответствовать началу расширенного значения параметра . Если шаблон начинается с % , он должен соответствовать в конце расширенного значения параметра . Другими словами,
      %  (the-rest_of_the_pattern) 
    действует как
       (the-rest_of_the_regex)  $ 
    (да, это кажется немного назад). Итак, шаблон , это просто % похоже на регулярное выражение, которое представляет собой просто $ - он соответствует концу входной строки (область поиска).
  • И я использую строку из / test .Таким образом, конец параметра заменяется на / test (т.е. он добавляет к параметру / test ).
  • Еще кое-что о $ { параметр / шаблон / строка } что не интуитивно понятно, так это то, что всегда заканчивается на } . Это не обязательно, и не может заканчиваться третьим / . Следовательно, / в строке нельзя интерпретировать как разделитель, и поэтому у нас может быть строка из / test без необходимости выходить из / .
  • Если параметр является переменной массива с индексами @ или * , операция подстановки применяется по очереди к каждому члену массива.
  • Когда вы ссылаетесь на массив как $ { name [@]} (вместо $ { name [*]} ) и заключите результаты в двойные кавычки, вы сохраняете целостность элементов массива (т.е. вы сохраняете в них пробелы и другие специальные символы) без объединения отдельных элементов в одно длинное слово.
7
27.01.2020, 21:50

Шаблон подстановочного знака расширяется оболочкой перед вызовом команды. См. ответ G-Man для полного объяснения.

Большинству оболочек требуется некоторая форма промежуточной команды, чтобы применить преобразование текста к совпадениям. Zsh предлагает способ преобразования совпадений на лету с помощью квалификаторов glob :

  • e или + для выполнения кода для каждого совпадения, который может изменить совпадение путем модификации строка REPLY (или даже изменить количество совпадений, изменив массив reply )
  • : , за которым следует модификатор раскрытия истории для применения некоторые встроенные преобразования

Примеры:

mkdir */(:s:/:/test:)     # takes advantage of the fact that each match ends with /, which it replaces by /test
mkdir *(/e:REPLY+=/test:)
2
27.01.2020, 21:50

Теги

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