начало grep файла?

В оболочке Linux я хочу удостовериться, что определенный набор файлов все начинают <?, наличие, что точная строка и никакие другие символы вначале. Как может я grep или использовать, некоторый другой для выражения "файла начинает"?


Править: Я - wildcarding это, и head не дает имя файла на той же строке, поэтому когда я grep она, я не вижу filname. Кроме того, "^<?" кажется, не дает правильные результаты; в основном я получаю это:

$> head -1 * | grep "^<?"
<?
<?
<?
<?
<?
...

Все файлы на самом деле хороши.

10
задан 12.03.2010, 21:38

9 ответов

В Bash:

for file in *; do [[ "$(head -1 "$file")" =~ ^\<\? ]] || echo "$file"; done

Удостоверьтесь, что они - файлы:

for file in *; do [ -f "$file" ] || continue; [[ "$(head -1 "$file")" =~ ^\<\? ]] || echo "$file"; done

11
ответ дан 07.12.2019, 12:38

Сделайте grep:

$ head -n 1 * | grep -B1 "^<?"
==> foo <==
<?
--
==> bar <==
<?
--
==> baz <==
<?

Синтаксический анализ имена файлов:

$ head -n 1 * | grep -B1 "^<?" | sed -n 's/^==> \(.*\) <==$/\1/p'
foo
bar
baz
4
ответ дан 07.12.2019, 12:38

Можно использовать awk для этого:

$ cat test1
<?xxx>
111
222
333
$ cat test2
qqq
aaa
zzz
$ awk '/^<\?/{print "Starting with \"<?\":\t" ARGV[ARGIND]; nextfile} {print "Not starting with \"<?\":\t" ARGV[ARGIND]; nextfile}' *
Starting with "<?":     test1
Not starting with "<?": test2
$
3
ответ дан 07.12.2019, 12:38

За исключением пустых файлов, этот сценарий Perl, кажется, работает:

perl -e 'while (<>) { print "$ARGV\n" unless m/^<\?/; close ARGV; }' *

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

find . -type f -size +0 -print0 |
    xargs -0 perl -e 'while (<>) { print "$ARGV\n" unless m/^<\?/; close ARGV; }'
3
ответ дан 07.12.2019, 12:38

Попробуйте это

for i in `find * | grep "php$"`; do echo -n $i " -> "; head -1 $i; done

Это получит список каждого файла, заканчивающегося в PHP, затем цикл через него. повторение имени файла и затем печать первой строки файла. Я просто вставил

даст Вам вывод как:

calendar.php  -> <?php
error.php  -> <?php
events.php  -> <?php
gallery.php  ->
index.php  -> <?php
splash.php  -> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
information.php  -> <?php
location.php  -> <?php
menu.php  -> <?php
res.php  -> <?php
blah.php  -> <?php

затем можно засунуть нормальный grep в конце для избавлений от того, что Вы хотите видеть и найти просто исключениями

for i in `find * | grep "php$"`; do echo -n $i " -> "; head -1 $i; done | grep -v "<?php"

вывод:

gallery.php  ->
splash.php  -> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2
ответ дан 07.12.2019, 12:38

Bash 4.0

#!/bin/bash
shopt -s globstar
for php file in /path/**/*.php
do
   exec 4<"$php";read line <&4;exec 4<&-
   case "$line" in
     "<?"*) echo "found: $php"
   esac

done
1
ответ дан 07.12.2019, 12:38
cat file.txt | head -1 | grep "^<?"

должен сделать то, что Вы просите.

0
ответ дан 07.12.2019, 12:38

это:

  % for i in *; do head -1 $i | grep "^<?" ; echo "$i : $?"; done

дает Вам что-то вроде этого:

  foo.xml: 0
  bla.txt: 1

каждый файл, не содержащий Ваш шаблон, будет "отмечен" с "1". можно играть с этим, пока это не соответствует потребностям.

0
ответ дан 07.12.2019, 12:38

Позвольте мне делать попытку этого

find -type f | awk '
{
 if(getline ret < $0){
  if(ret~"^<\\?$"){
   print "Good["$0"]["ret"]";
  }else{
   print "Fail["$0"]";
  };
 }else{
  print "empty["$0"]";
 };
 close($0);
}'

никто не сказал, что wak не был доступен :-)

0
ответ дан 07.12.2019, 12:38

Теги

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