Как можно статировать весь каталог, используя одну командную строку, начинающуюся с bash -c?

Вы можете использовать средства управления строкой bash, предоставляемые расширением параметра , в частности $ { ПЕРЕМЕННАЯ // ШАБЛОН / ЗАМЕНА } форма. Имейте в виду, что / - не единственный символ, который необходимо заменить: в замене s символы \ , & , перевод строки и разделитель s все должны иметь префикс обратной косой черты.

replacement=$directory
replacement=${replacement//\\/\\\\}
replacement=${replacement//\//\\/}
replacement=${replacement//&/\\&}
replacement=${replacement//$'\n'/\\$'\n'}
sed -i "s/%DIR%/$replacement/g" -- "$config"

В качестве альтернативы можно использовать инструмент, не требующий таких кавычек, например awk или Perl.

directory=$directory awk '{gsub(/%DIR%/, ENVIRON["directory"])} 1' <"$config" >"$config.new" &&
mv -- "$config.new" "$config"

или

directory=$directory perl -i -pe 's/%DIR%/$ENV{directory}/g' "$config"

1
04.03.2019, 09:42
2 ответа

Параметры расширенного глобуса видны только для текущей оболочки и не для запущенных вспомогательных -оболочек. Вам нужно установить их внутри оболочки sub -также, чтобы была доступна опция glob. Также **выполняет рекурсивный спуск, только если установлена ​​другая расширенная опция globstar. Только для вашего требования к текущему каталогу вы можете просто использовать*

bash -c 'shopt -s dotglob; stat /path/todir/*'

Обратите внимание на использование одинарных кавычек вокруг всего списка команд оболочки. Это намного безопаснее, так как вы можете избежать ненужного расширения переменной (передачи литеральной строки )и с большей легкостью использовать строки в кавычках.

Если у вас есть контроль над частью за пределами '..', вы можете установить параметр расширенной оболочки в самом вызове как

bash -O dotglob -c 'stat /path/todir/*'

Тем не менее, если доступна возможность использования внешних утилит, таких как find, вы можете просто сделать ниже, что просто исключает.(имя текущего каталога )и включает все файлы в текущем каталоге и передает его statодним выстрелом.

find. ! -path. -exec stat {} +
2
27.01.2020, 23:22
bash -c -O extglob 'stat /path/todir/!(.|..)'

-O extglobвключает дополнительные операторы сопоставления с образцом, в том числе !(pattern-list)для отрицания.

[-+]O [shopt_option]
         shopt_option is one of the shell options accepted by the shopt builtin  (see  
         SHELL  BUILTIN  COMMANDS  below). If shopt_option  is  present, -O sets the 
         value of that option; +O unsets it.

If the extglob shell option is enabled using the shopt builtin, several extended pattern matching
operators  are recognized.  In the following description, a pattern-list is a list of one or more
patterns separated by a |.  Composite patterns may be formed using one or more of  the  following
sub-patterns:

      ?(pattern-list)
             Matches zero or one occurrence of the given patterns
      *(pattern-list)
             Matches zero or more occurrences of the given patterns
      +(pattern-list)
             Matches one or more occurrences of the given patterns
      @(pattern-list)
             Matches one of the given patterns
      !(pattern-list)
             Matches anything except one of the given patterns
1
27.01.2020, 23:22

Теги

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