리눅스 셸에서 특정 파일 세트가 모두 시작으로 <?
끝나고 정확한 문자열이 있고 다른 문자는 시작하지 않도록하고 싶습니다 . “파일 시작”을 표현하기 위해 어떻게 grep하거나 다른 것을 사용할 수 있습니까?
편집 : 나는 이것을 와일드 카드 head
로 만들고 같은 줄에 파일 이름을 지정하지 않으므로 grep 할 때 파일 이름이 표시되지 않습니다. 또한 "^<?"
올바른 결과를 제공하지 않는 것 같습니다. 기본적으로 나는 이것을 얻고있다 :
$> head -1 * | grep "^<?"
<?
<?
<?
<?
<?
...
모든 파일이 실제로 좋습니다.
답변
배쉬에서 :
for file in *; do [[ "$(head -1 "$file")" =~ ^\<\? ]] || echo "$file"; done
파일인지 확인하십시오.
for file in *; do [ -f "$file" ] || continue; [[ "$(head -1 "$file")" =~ ^\<\? ]] || echo "$file"; done
답변
할 grep
:
$ head -n 1 * | grep -B1 "^<?"
==> foo <==
<?
--
==> bar <==
<?
--
==> baz <==
<?
파일 이름을 구문 분석하십시오.
$ head -n 1 * | grep -B1 "^<?" | sed -n 's/^==> \(.*\) <==$/\1/p'
foo
bar
baz
답변
이것을 위해 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
$
답변
빈 파일을 제외하고이 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; }'
답변
이 시도
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">
답변
배쉬 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
답변
cat file.txt | head -1 | grep "^<?"
당신이 원하는 것을해야합니다.