फ़ाइल की शुरुआत grep?


10

एक लिनक्स शेल में, मैं यह सुनिश्चित करना चाहता हूं कि फाइलों का एक निश्चित सेट सभी के साथ शुरू हो <?, जिसमें सटीक स्ट्रिंग और शुरुआत में कोई अन्य वर्ण न हो। मैं "फ़ाइल के साथ शुरू होता है" को व्यक्त करने के लिए कुछ और कैसे उपयोग कर सकता हूं?


संपादित करें: मैं इसे वाइल्डकार्ड कर रहा हूं, और headएक ही लाइन पर फ़ाइल नाम नहीं देता, इसलिए जब मैं इसे पकड़ता हूं, तो मैं फ़ाइलनाम नहीं देखता हूं। इसके अलावा, "^<?"सही परिणाम देने के लिए प्रतीत नहीं होता है; मूल रूप से मुझे यह मिल रहा है:

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

सभी फाइलें वास्तव में अच्छी हैं।

जवाबों:


11

बैश में:

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

सुनिश्चित करें कि वे फाइलें हैं:

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


और चूँकि हम सभी इतने पांडित्यपूर्ण हैं: बड़ी मात्रा में फाइलनेम पर ग्लोब ऑपरेटर का उपयोग नहीं करते हैं, इसके बजायfind
akira

का उपयोग करके findभी पाइप शुरू करने के लिए सीधे सादे फ़ाइलों को वापस कर सकते हैं।
mpez0

1
आप इसे पूरी तरह से बैश में कर सकते हैं जब readइसके बजाय head, का उपयोग करें : for file in *; do [ -f "$file" ] || continue; read < "$file"; [[ "$REPLY" =~ ^\<\? ]] || echo "$file"; done
जानमोसन


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
$

3

खाली फ़ाइलों को छोड़कर, यह पर्ल स्क्रिप्ट काम करती है:

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; }'

2

इसे इस्तेमाल करे

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
बेकार का बेकार उपयोग; "find -name '* .php' का प्रयोग करें। इसके अलावा, चर का खतरनाक उपयोग: "विशेष" फ़ाइल नामों के साथ समस्याओं से बचने के लिए "अपने-यहां की आज्ञा पाएं {{} '' +"। इसके अलावा, हमेशा अपने चर को उद्धृत करें: "सिर -1" $ i "", "सिर -1 $ i" नहीं।
जानमोसेन

for x in *.php;do echo $x \"head -n1 $ x\";done
user23307

1

बैश 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

0
cat file.txt | head -1 | grep "^<?"

आपको वही करना चाहिए जो आप पूछ रहे हैं।


हाँ, लेकिन अगर मैं इसे वाइल्डकार्ड करता हूं, तो यह मुझे फ़ाइल नाम नहीं देता :( इसके अलावा "^ <?" मेरे लिए काम नहीं करता था, मैंने -v स्विच का उपयोग किया।
user13743

2
@ घोषी अनिवार्य catउपयोग, head -1 file.txt | grep "^<?"पर्याप्त है।
बेंजामिन बैनियर

1
बिल्ली का बेकार उपयोग: - (((
vwegert

बेकार बिल्ली बेकार है :(
user13743

मुझे लगता है कि यह कमांड को याद रखने के लिए बहुत सरल है यदि आप सब कुछ मॉड्यूलर और टूटा हुआ रखते हैं। I-know- बिल्ली काम करेगी, मुझे नहीं पता commandकि फाइल को एक तर्क के रूप में लेंगे या नहीं । यह कड़ाई से आवश्यक नहीं हो सकता है, लेकिन मैं इसे बाहर नहीं ले जा रहा हूं :)
20

0

इस:

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

आपको कुछ इस तरह देता है:

  foo.xml: 0
  bla.txt: 1

हर फ़ाइल जिसमें आपका पैटर्न नहीं है, उसे "1" के साथ "चिह्नित" किया जाएगा। आप इसके साथ खेल सकते हैं जब तक कि यह आपकी आवश्यकताओं के अनुरूप न हो।


1
यदि वे रिक्त स्थान शामिल कर सकते हैं तो आपको फ़ाइल नामों को उद्धृत करने की आवश्यकता है। और आप शायद 'grep' से / dev / null तक आउटपुट खोना चाहेंगे। आप यह भी उपयोग कर सकते हैं: head -1 "$i" | grep '^<?' || echo "$i"यदि यह समस्याग्रस्त है तो केवल फ़ाइल नाम प्रिंट करेगा।
जोनाथन लेफ़लर

2
यही "grep -q" के लिए है। :-)
जन्मोसेन

0

मुझे इस पर जाने दो

find -type f | जाग '
{
 अगर (getline <$ 0) {
  अगर (सेवानिवृत्त ~ "^ <\\? $") {
   प्रिंट "गुड [" $ 0 "] [" रिट ""];
  }अन्य{
   प्रिंट "विफल [" $ 0 "]";
  };
 }अन्य{
  प्रिंट "खाली [" $ 0 "]";
 };
 करीब ($ 0);
} '

किसी ने कहा कि wak उपलब्ध नहीं था :-)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.