Сначала необходимо отсортировать файл1 и файл2 (используя команду sort
). Затем вы можете использовать команду join
.
join -a 1 file1 file2
вывод:
test4
команда -a 1
печатает строки, которые не совпадают в файле1.
справочная страница:
-a FILENUM print unpairable lines coming from file FILENUM, where
FILENUM is 1 or 2, corresponding to FILE1 or FILE2
Возможно, вы ищете шаблон
[a-z][a-z][0-9][0-9].txt
. Он будет соответствовать любому имени в текущем каталоге, состоящему ровно из двух символов нижнего регистра, за которыми следуют две цифры, за которыми следует буквенная строка . .txt
.
Шаблоны подстановки имен файлов, в отличие от регулярных выражений, автоматически привязываются к началу и концу строки, поэтому нам не нужно говорить ничего особенного об именах файлов, не содержащих символы перед первым из двух символов нижнего регистра или после .txt
.
Вы можете использовать этот шаблон с rm
напрямую:
$ rm "$HOME"/[a-z][a-z][0-9][0-9].txt
или, если вы хотите выполнить рекурсию во все подкаталоги, с find
:
$ find "$HOME" -name "[a-z][a-z][0-9][0-9].txt" -delete
Если ваша реализация найти
не поддерживает -удалить
, вместо этого рассмотрите следующее:
$ find "$HOME" -name "[a-z][a-z][0-9][0-9].txt" -exec rm {} +
PS: используйте слово цифра, когда вы имеете в виду число от нуля до девяти. число немного расплывчато, тем более что 233, которое является частью нескольких имен файлов в примерах, является числом. (С тех пор я отредактировал вопрос, чтобы устранить эту двусмысленность)
Что насчет этого?
find /path/to/parent/dir/ -regextype posix-extended -regex '.*/[a-z]{2}[0-9]{2}\.txt' -exec rm {} \;