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.
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'