Oldschool, просто переведите свое предложение в стандартные команды:
for file in *; do
if head -n 1 "${file}" | grep -q 'PATTERN'; then
cat "${file}"
fi
done
Для изучения bash это хорошее начало. Если вам просто нужно быстрое решение, попробуйте ответы на sed, awk или perl. Оба хороши, но это собственные языки, которые вам нужно (и, вероятно, вы хотите) выучить.
Это довольно простой пример, поэтому, если вы хотите узнать больше, вы также можете попробовать то же самое на ruby, php, js (например, в nodejs) или на любом другом языке, который разрешает доступ к файлам. Даже C / C ++ или Java должны легко справляться с небольшой задачей.
Вы можете просто указать find
исключить файлы, начинающиеся с pure_
, а также выполнить grep
с выражением -regex
:
find./path -mindepth 1 -maxdepth 2 -type f ! -name 'pure_*' -regex '.*\.[0-9][0-9][0-9].txt$'
С копиями в моделируемом каталоге из вашего примера я получаю:
./path/1/file1.001.txt
./path/1/file2.001.txt
./path/2/file3.002.txt
find -type f | egrep "[0-9]{3}\.txt$" | grep -v pure_
Программа find
ищет файлы, начинающиеся в вашем текущем каталоге.
egrep
применяет расширенные регулярные выражения, фильтруя три цифры, к которым добавляется ".txt" (точки должны быть экранированы, иначе "Atxt" тоже будет соответствовать )в конце строки.
grep
отфильтровывает(-v
)строк со строкой "чистый _" (Я не уверен, что место "чистого _" важно ).
find
без сопоставления с регулярным выражением:
find /path -type f ! -name 'pure_*' -name '*[0-9][0-9][0-9].txt'
Это найдет любой обычный файл в каталоге /path
или под ним, имя которого не начинается с pure_
, а заканчивается тремя цифрами и .txt
.