tcsh - эхо-код escape для escape

С xargs + find

Одним из решений является использование xargs для создания безумно длинных команды find , которые будут искать тысячи файлов одновременно:

sed -e 's/^/-o -name /' "${Region}_${date}.txt" \
| xargs find "$DataDir" -false \
> "${runDir}/st_$Region"

Первая команда sed превращает каждое имя файла в выражение -o -name filename , которое будет быть добавленным xargs к команде find . Затем xargs выполняет созданные им команды find . Результат сохраняется непосредственно в файле st_ $ Region .

Хорошо. Но как мы собираемся построить $ {Region} _filesnotfound_ $ date.txt , список файлов, которые не были найдены? Просто пересекая полный исходный список со списком найденных файлов:

comm -3 \
    <(sort -u "${Region}_${date}.txt") \
    <(xargs -L1 basename < "${runDir}/st_$Region" | sort -u) \
    > "${Region}_filesnotfound_$date.txt"

comm -3 подавляет общие строки между двумя файлами. На самом деле это псевдо-файлы.Второй файл является результатом команды basename , примененной к каждому найденному файлу. Оба файла отсортированы.

С помощью find + grep

Другое решение - grep имена файлов из вывода find . grep предлагает возможность (через параметр -f ) искать серию шаблонов, хранящихся в файле. У нас есть ряд имен файлов в файле. Создадим список шаблонов и передадим его в grep :

find "$DataDir" \
| grep -f <(sed 's|.*|/&$|' "${Region}_${date}.txt") \
> "${runDir}/st_$Region"

Команда sed является обязательной: она привязывает имя файла к концу пути для поиска.

Что касается списка недостающих файлов, он будет построен так же, как и другое решение.

Проблема с этим решением заключается в том, что имена файлов могут содержать символы, которые могут интерпретироваться grep : . , * , [ и т. Д. Мы должны избежать их с помощью sed (оставляю это читателю в качестве упражнения). Поэтому ИМХО следует отдавать предпочтение первому решению.

Наконец, обратите внимание, что я использовал здесь некоторые измов bash (например, подстановки процессов <(...) ). Не ожидайте, что какое-либо из моих решений будет совместимо с POSIX.

1
14.03.2017, 19:09
1 ответ

printf расширяет те, которые указаны в (первом) аргументе формата, на сам по себе, нет необходимости в этих цитатах ksh93 -style $ '...' . Итак:

printf '\33[2J\33[H'

Обратите внимание, что printf не является встроенным в tcsh , поэтому вы вызываете команду printf в файловой системе.Тогда вы также можете вызвать команды tput или clear , но в tcsh в этом нет необходимости, поскольку tcsh имеет встроенную поддержку для termcap / terminfo, чтобы вы могли:

echotc clear

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

Если вы хотите использовать встроенный echo tcsh ], вы можете сделать:

set echo_style = both # meant to be the default in tcsh
echo -n '\033[2J\033[H'

Или:

set echo_style = sysv # or both
echo '\033[2J\033[H\c'
5
27.01.2020, 23:16

Теги

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