Перечислите любой файл, заканчивающийся .in и соответствующий .out со сценарием оболочки

Ключевое событие сгенерировано X-сервером (как настроено xmodmap), и отправляется в Ваши X приложений. Ваш менеджер окон мог прервать это, прежде чем он будет отправлен в xterm. XTerm, в свою очередь, переводит событие в некоторые байты и отправляет байты в pseudo-tty, выделенный Вашей оболочкой, ударом.

Обратите внимание на то, что не все события переводятся непосредственно в байты XTerm. Например, Ctrl и клавиши Shift, собой, генерируют X событий клавиатуры, но XTerm ничего не отправляет в оболочку (или другое приложение) работающий в нем. Это также включает Метаклавишу отдельно, но не Клавишу меню. Однако событие, сгенерированное путем нажатия Meta-e, заставит XTerm отправить или байт 0xE5 или двухбайтовый 0x1B 0x65 последовательности, в зависимости от XTerm. Установка ресурса VT100.metaSendsEscape.

4
19.02.2013, 22:51
4 ответа

Первое соответствие против всех файлов и проверка, если .out файл существует, то печатают имя:

for x in *; do
   if [[ "$x" =~ ^(.*)\.in ]] && [[ -f ${BASH_REMATCH[1]}.out ]];then 
      echo -n "$x ${x%%.in}.out "; 
   fi
done
echo
3
27.01.2020, 20:47
  • 1
    Daaaayumn. Я понятия не имел, что Bash мог сохранить подстроки к переменной как этот. Это BASH_REMATCH массив является потрясающим. Niiice! PS: Вы могли упростить это в одно [[ ... && ... ]] выражение. –  rsaw 26.11.2012, 05:44
  • 2
    @ryran, [[...]] и [[...]], как гарантируют, будет обработан слева направо. Вы уверены это [[... &&...]] также так гарантируется? (Не настолько интересный, если это просто, оказывается, теперь так обрабатывается в текущей версии удара.) –  dubiousjim 26.11.2012, 11:53
  • 3
    @dubiousjim: Да, я уверен это [[ ... && ...]] обрабатывается как ожидалось. Смотрите на страницу справочника удара под [[ expression ]] раздел. –  rsaw 26.11.2012, 16:58
  • 4
    Не Был бы это быть более эффективным только выбрать "*.in" файлы, например, "для x в *.in;" вместо того, чтобы выбрать все файлы и затем проверить, если файл заканчивается ".in"? –  Daemon of Chaos 26.11.2012, 17:00

Так как Вы хотите .in быть соединенным с .out, цикл через только *.in и проверьте, существует ли соответствие .out файл, если так, распечатывает обоих:

for f in *.in; do
  if [[ -f ${f%.in}.out ]]; then
    echo $f
    echo ${f%.in}.out
  fi
done
5
27.01.2020, 20:47
  • 1
    Это - то, как я сделал бы это. Сладкий и простой. Я упростил бы его до одной строки хотя: for f in *.in; do [[ -e ${f%.in}.out ]] && echo $f ${f%.in}.out; done –  rsaw 26.11.2012, 17:03

С zsh:

has_out() [[ -e $REPLY:r.out ]]
ls -ld -- *.in(+has_out)
2
27.01.2020, 20:47

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

$ ls | grep '\(\.in\|.out\)$' | sed 's/....$//' \
     | sort | uniq -c | grep '^[\t ]*2' | sed 's/^[\t ]\+2 //'

Преимущества:

  • не должен колотить
  • делает всего одну дорогую операцию - список каталогов - т.е. не нуждается к статистике (2) каждый файл (как в [[ -f ... ]])

В случае, если ls уже в алфавитном порядке сортирует его вывод sort команда может быть удалена из канала. Я не знаю, указывает ли POSIX поведение сортировки a ls.

Канал печатает все базовые имена если файлы с .in и .out расширение.

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

$ ls | grep '\(\.in\|.out\)$' | sed 's/....$//' \
     | sort | uniq -c | grep '^[\t ]*2' \
     | sed -e 's/^[\t ]\+2 //' -e 's/$/.in/ ; p; s/in$/out/'
1
27.01.2020, 20:47

Теги

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