在 Linux shell 中,我想确保一组文件都以 开头<?
,并且包含该字符串,开头没有其他字符。我该如何 grep 或使用其他方式来表达“文件以 开头”?
编辑:我对此使用了通配符,并且head
没有在同一行上给出文件名,因此当我 grep 它时,我看不到文件名。而且,"^<?"
似乎没有给出正确的结果;基本上我得到的是:
$> head -1 * | grep "^<?"
<?
<?
<?
<?
<?
...
所有文件实际上都很好。
答案1
在 Bash 中:
for file in *; do [[ "$(head -1 "$file")" =~ ^\<\? ]] || echo "$file"; done
确保它们是文件:
for file in *; do [ -f "$file" ] || continue; [[ "$(head -1 "$file")" =~ ^\<\? ]] || echo "$file"; done
答案2
执行以下操作grep
:
$ head -n 1 * | grep -B1 "^<?"
==> foo <==
<?
--
==> bar <==
<?
--
==> baz <==
<?
解析文件名:
$ head -n 1 * | grep -B1 "^<?" | sed -n 's/^==> \(.*\) <==$/\1/p'
foo
bar
baz
答案3
您可以使用 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
$
答案4
尝试这个
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">