গ্রেপ ফাইল শুরু?


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


এবং যেহেতু আমরা সবাই তাই গোঁড়া আছেন: filesnames বিপুল পরিমাণে উপর উল্লিখিত glob অপারেটর ব্যবহার করবেন না, পরিবর্তে ব্যবহারfind
আকিরা

findপাইপ শুরু করতে কেবল প্লেইন ফাইলগুলি সরাসরি ব্যবহার করতে পারে।
এমপিজেড

1
readপরিবর্তে এটি ব্যবহার করার সময় আপনি এটি পুরোপুরি ব্যাশ করতে পারেন head: for file in *; do [ -f "$file" ] || continue; read < "$file"; [[ "$REPLY" =~ ^\<\? ]] || echo "$file"; done
janmoesen


3

আপনি এর জন্য বিশ্রী ব্যবহার করতে পারেন:

$ 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

এটি পিএইচপি-তে শেষ হওয়া প্রতিটি ফাইলের একটি তালিকা পাবেন, তারপরে এটি লুপ করুন। ফাইলের নাম প্রতিধ্বনি এবং তারপরে ফাইলটির প্রথম লাইনটি মুদ্রণ করা। আমি সবেমাত্র .োকানো

আপনাকে যেমন আউটপুট দেবে:

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

তবে আপনি যা দেখতে চান তা থেকে মুক্তি পেতে এবং কেবল ব্যাতিক্রমগুলি খুঁজে পেতে আপনি শেষে একটি সাধারণ গ্রেপ আটকে রাখতে পারেন

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" নয়।
janmoesen

for x in *.php;do echo $x \"হেড -n1 $ x\";done
ব্যবহারকারী 23307

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 সুইচটি ব্যবহার করেছি
ব্যবহারকারীর13743

2
@ ফোশি বাধ্যতামূলক catব্যবহার head -1 file.txt | grep "^<?"যথেষ্ট।
বেনজামিন ব্যানিয়ার

1
বিড়ালের
অকেজো

অকেজো বিড়াল অকেজো :(
ব্যবহারকারী 13743

আপনি যদি সবকিছুকে মডিউল করে এবং ভেঙে ফেলা করেন তবে কমান্ডগুলি মনে রাখা খুব সহজ find আমি-জ্ঞান-বিড়াল কাজ করবে, আমি জানি না commandফাইলটি আর্গুমেন্ট হিসাবে গ্রহণ করবে কিনা । এটি কঠোরভাবে প্রয়োজনীয় নাও হতে পারে তবে আমি এটিকে বাইরে নিচ্ছি না :)
ফোশি

0

এই:

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

আপনাকে এরকম কিছু দেয়:

  foo.xml: 0
  bla.txt: 1

আপনার প্যাটার্ন না থাকা প্রতিটি ফাইল "1" দিয়ে "চিহ্নিত" হবে। আপনার প্রয়োজন অনুসারে এটি খেলতে পারবেন।


1
আপনার ফাইলের নাম উল্লেখ করতে হবে যদি সেগুলিতে স্পেস থাকতে পারে। এবং আপনি সম্ভবত 'গ্রেপ' থেকে / ডিভ / নাল এ আউটপুট হারাতে চাইবেন। আপনি এটিও ব্যবহার করতে পারেন: head -1 "$i" | grep '^<?' || echo "$i"এটি যদি সমস্যা হয় তবে কেবলমাত্র ফাইলের নাম মুদ্রণ করবে।
জোনাথন লেফলার

2
"গ্রেপ-কিউ" এর জন্য এটি। :-)
janmoesen

0

আমাকে এই একবার যেতে দিন

ফাইন্ড-টাইপ চ | বুদ্ধিমান
{
 যদি (getline ret <$ 0)
  যদি (অব ~ "^ <\\? $") {
   "ভাল [" $ 0 "] [" ret "]" মুদ্রণ করুন;
  } অন্য {
   "ব্যর্থ [" $ 0 "]" মুদ্রণ করুন;
  };
 } অন্য {
  "খালি [" $ 0 "]" মুদ্রণ করুন;
 };
 ঘনিষ্ঠ ($ 0);
} '

কেউ বলেনি ওয়াক উপলভ্য ছিল না :-)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.