সমস্ত ডিরেক্টরি তালিকাভুক্ত করুন যার ভিতরে একটি প্রদত্ত ফাইলের নাম সহ কোনও ফাইল নেই


12

যে সমস্ত ডিরেক্টরি ভিতরে একটি প্রদত্ত ফাইলের নাম সহ একটি ফাইল নেই তাদের তালিকাতে আমি কীভাবে যাব ? যেমন এই গাছ দেওয়া

/
  /a
     README
     file001
     file002
  /b
     README
     file001
  /c
     file003

আমি ডিরেক্টরি যে করণীয় তালিকা করতে চান না নামের একটি ফাইল আছে READMEএই ক্ষেত্রে এটা ডিরেক্টরি হবে এ, /c। আমি যে কিভাবে করতে হবে? উদাহরণস্বরূপ আমি কোনও সিনট্যাক্স ব্যবহার করতে পারি না find


লজ্জা উহু লজ্জা আপনি এমনকি অনুসন্ধান নি: askubuntu.com/questions/196960/...
SLM

অনুসন্ধান করার সময় আমি সঠিক কীওয়ার্ডগুলির কথা ভাবিনি।
রেনান

2
আমি কেবল আপনার চপগুলি বস্ট করছি। আমি সেখানে অনেকবার এসেছি যেখানে 8- এর জন্য কিছু অনুসন্ধান করার জন্য আমি সঠিক শব্দটি ভাবতে পারি না)।
slm

উত্তর:


5

findGNU এর মতো একটি বাস্তবায়ন ধরে নেওয়া findযা এতে {}একটি যুক্তিতে এম্বেড থাকা গ্রহণ করে -exec:

$ find . -type d \! -exec test -e '{}/README' \; -print

উদাহরণ

এখানে 1/1 থেকে 5/5 এর মধ্যে ডিরেক্টরিগুলির একটি README রয়েছে, অন্যান্য ডায়ারগুলি খালি রয়েছে।

$ tree 
.
|-- 1
|   `-- 1
|       `-- README
|-- 10
|   `-- 10
|-- 2
|   `-- 2
|       `-- README
|-- 3
|   `-- 3
|       `-- README
|-- 4
|   `-- 4
|       `-- README
|-- 5
|   `-- 5
|       `-- README
|-- 6
|   `-- 6
|-- 7
|   `-- 7
|-- 8
|   `-- 8
`-- 9
    `-- 9

এখন যখন আমরা আমাদের findকমান্ডের এই সংস্করণটি চালাই :

$ find . -type d \! -exec test -e '{}/README' \; -print
.
./10
./10/10
./7
./7/7
./9
./9/9
./6
./6/6
./5
./8
./8/8
./4
./1
./3
./2

তথ্যসূত্র


নির্দিষ্ট ডিরেক্টরি এক্সটেনশন (যা * .txt বলুন) থাকে না এমন সাব ডিরেক্টরিগুলি অনুসন্ধান করার জন্য কমান্ডটি কীভাবে পরিবর্তন করতে হয়। * .Txt দিয়ে README পরিবর্তন করা কাজ করছে বলে মনে হচ্ছে না
WanderingMind

@WanderingMind - যদি আপনি একটি নতুন প্রশ্ন আছে ;-) সাইটে একটি নতুন এক যেমন জিজ্ঞাসা করুন
SLM

3

আপনি ফাইলটি পরীক্ষা করতে -execবিকল্পটি ব্যবহার করতে পারেন findএবং তারপরে সমস্ত ফলাফল মুদ্রণ করতে পারেন যার জন্য চেকটি ব্যর্থ হয়।

find /path/to/base -mindepth 1 -maxdepth 1 -type d -exec test -e {}/README \; -o -print

3

দরকার নেই find। কেবল শেলটি ব্যবহার করুন:

for d in */; do [ -f "$d"README ] || printf '%s\n' "$d"; done
c/

আপনি এটি প্রয়োজন তাহলে রিকার্সিভ হতে চাইলে আমাদের অবশ্যই (জন্য ব্যবহার করতে পারেন bash, zshডিফল্ট, ব্যবহার দ্বারা এটা করতে পারেন set -o globstarমধ্যে ksh93):

shopt -s globstar
for d in **/; do [ -f "$d"README ] || printf '%s\n' "$d"; done

(মনে রাখবেন যে ডট-ফাইলগুলি ডিফল্টরূপে বাদ দেওয়া হয়)।


2

সঙ্গে zshএবং উল্লিখিত glob কোয়ালিফায়ার ( eস্ট্রিং ):

print -rl -- *(/e_'[[ ! -f $REPLY/README ]]'_)

অথবা

print -rl -- *(/^e_'[[ -f $REPLY/README ]]'_)

Dলুকানো ডিরেক্টরি অন্তর্ভুক্ত করতে যুক্ত করুন :

print -rl -- *(D/e_'[[ ! -f $REPLY/README ]]'_)

/কেবল ডিরেক্টরিগুলি নির্বাচন করে এবং e_'[[ ! -f $REPLY/README ]]'_কেবলমাত্র ডিরেক্টরি নাম নির্বাচন করে যার জন্য উদ্ধৃতিগুলির মধ্যে শেল কোডটি প্রত্যাবর্তন করে true, এটি প্রতিটি ডিরেক্টরি নামের জন্য ( $REPLY) যা গ্লোব *(/)প্রসারিত হয়, এটি সঞ্চালিত হয় [[ ! -f $REPLY/README ]]এবং ফলাফল থাকলে ডিরেক্টরিটির নাম রাখে true
দ্বিতীয় ফর্মটি ^e_'.....'_একই গ্লোব কোয়ালিফায়ার, অবহেলিত (তবে এবার শর্তসাপেক্ষ প্রকাশটি তুচ্ছ নয় [[ -f $REPLY/README ]]) ব্যবহার করে।


উপরেরগুলি কেবল বর্তমান ডিরেক্টরিতে ডিরেক্টরিগুলির নাম ফেরত দেবে।
আপনি যদি পুনরাবৃত্তভাবে অনুসন্ধান করতে চান (আবার, গোপন ডিরেক্টরিগুলি Dকোয়ালিফায়ার যুক্ত করতে ):

print -rl ./**/*(/e_'[[ ! -f $REPLY/README ]]'_)

2

বহনযোগ্যভাবে, আপনি করতে পারেন:

find . -type d -exec sh -c '
  for dir do
    [ -f "$dir/README" ] || printf "%s\n" "$dir"
  done' sh '{}' +

[ -f file ]ফাইলটি উপস্থিত থাকলে এবং এটি নিয়মিত ফাইল (সিমিলিং রেজোলিউশনের পরে) হিসাবে নিশ্চিত হয়ে থাকে কিনা তা পরীক্ষা করে ।

আপনি যদি পরীক্ষা করতে চান যে এটি কেবলমাত্র (সেই ডিরেক্টরিতে প্রবেশ হিসাবে), এটি নির্বিশেষে, আপনার প্রয়োজন হবে: [ -e file ] || [ -L file ]যদিও নোট করুন যে এই পরীক্ষাগুলি সম্পাদন করার জন্য আপনাকে ডিরেক্টরিতে অনুসন্ধানের অনুমতি প্রয়োজন। আপনি [ -x "$dir" ]cases ক্ষেত্রেগুলির জন্য অ্যাকাউন্টে কিছু পরীক্ষা যোগ করতে চাইতে পারেন:

find . -type d -exec sh -c '
  for dir do
    if [ -x "$dir" ]; then
      [ -f "$dir/README" ] || printf "%s\n" "$dir"
    else
      printf >&2 "Cannot tell for \"%s\"\n" "$dir"
    fi
  done' sh '{}' +

বা সাথে রেসের অবস্থা এড়াতে zsh:

find . -type d -exec zsh -c '
  zmodload zsh/system
  for dir do
    ERRNO=0
    if [ ! -f "$dir/README" ]; then
      if [ "$errnos[ERRNO]" = ENOENT ]; then
        printf "%s\n" "$dir"
      else
        syserror -p "ERROR: $dir/README: "
      fi
    fi
  done' zsh '{}' +

এছাড়াও দেখুন আমি কীভাবে বলব যে ব্যাশে কোনও নিয়মিত ফাইল উপস্থিত না থাকে? তাই।

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