ডিরেক্টরিগুলি সন্ধান করুন যেখানে একটি নির্দিষ্ট সমাপ্তি সহ ফাইলগুলি অনুপস্থিত


10

আমি সমস্ত ডিরেক্টরি প্রদর্শন করতে চাই, যেগুলিতে একটি নির্দিষ্ট ফাইল সমাপ্তি সহ ফাইল থাকে না। অতএব আমি নিম্নলিখিত কোড ব্যবহার করার চেষ্টা করেছি:

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

এই উদাহরণে আমি সমস্ত ডিরেক্টরি প্রদর্শন করতে চেয়েছিলাম, যেগুলি সমাপ্তির সাথে ফাইলগুলি ধারণ .ENDINGকরে না, তবে এটি কার্যকর হয় না।

আমার ভুল কোথায়?


এটি ফাইল ডিরেক্টরিযুক্ত ডিরেক্টরি ডিরেক্টরিগুলির সদৃশ নয় কারণ প্রশ্নটি ওয়াইল্ডকার্ডগুলির সাথে কাজ করে না।
ক্রিশ্চিয়ান সিউপিতু

উত্তর:


7

এখানে তিনটি ধাপে একটি সমাধান:

temeraire:tmp jenny$ find . -type f -name \*ENDING -exec dirname {} \; |sort -u > /tmp/ending.lst
temeraire:tmp jenny$ find . -type d |sort -u > /tmp/dirs.lst
temeraire:tmp jenny$ comm -3 /tmp/dirs.lst /tmp/ending.lst 

2
বাশ শেলটি ব্যবহার করে অস্থায়ী ফাইল ছাড়াই ওয়ান-লাইনার:comm -3 <(find . -type f -name \*ENDING -exec dirname {} \; |sort -u) <(find . -type d |sort -u)
ক্রিশ্চিয়ান সিপিতু

4

এখানে আমরা যাই!

#!/usr/bin/env python3
import os

for curdir,dirnames,filenames in os.walk('.'):
  if len(tuple(filter(lambda x: x.endswith('.ENDING'), filenames))) == 0:
    print(curdir)

অথবা পর্যায়ক্রমে (এবং আরও পাইথোনিক):

#!/usr/bin/env python3
import os

for curdir,dirnames,filenames in os.walk('.'):
    # Props to Cristian Cliupitu for the better python
    if not any(x.endswith('.ENDING') for x in filenames):
        print(curdir)

বোনাস ডিএলসি কনটেন্ট!

ফাইন্ড কমান্ডের (বেশিরভাগ) সংশোধিত সংস্করণ:

find . -type d \! -exec bash -c 'set nullglob; test -f "{}"/*.ENDING' \; -print

আমি মনে করি খোঁজ সমাধান সঙ্গে ব্যর্থ test: ...: binary operator expectedযদি সেখানে একাধিক হয় *.ENDINGএকটি ডিরেক্টরির মধ্যে ফাইল।
ক্রিশ্চিয়ান সিউপিতু

next(filter(lambda x: x.endswith('.ENDING'), filenames))জেনারেটর উপলব্ধি ব্যবহার করেও লেখা যেতে পারে next(x for x in filenames if x.endswith('.ENDING'))
ক্রিশ্চিয়ান সিউপিতু

@ ক্রিশ্চিয়ানসিপিতু: সত্য: ফাইন্ড কমান্ডটি হ্যাকি এবং সত্যই সম্পূর্ণ পরীক্ষিত নয়। জেনারেটর উপলব্ধি - হ্যাঁ এটি করার আরেকটি দুর্দান্ত উপায়।
মাইকিবি

1
আমি মনে করি একটি খালি পুনরাবৃত্তের জন্য if not any(x.endswith('.ENDING') for x in filenames)কোনও রিটার্ন যে সত্য তার ভিত্তিতে একটি এমনকি ভাল সমাধান ব্যবহার করা হবে False
ক্রিশ্চিয়ান সিউপিতু

3

শেল বিস্তৃতি *, কিন্তু আপনার ক্ষেত্রে কোন শেল জড়িত, শুধু আছে পরীক্ষা হুকুমে মৃত্যুদন্ড কার্যকর খোঁজ । সুতরাং যে ফাইলটির অস্তিত্ব পরীক্ষা করা হয়, তার আক্ষরিক নাম দেওয়া হয় *.ENDING

পরিবর্তে আপনার এই জাতীয় কিছু ব্যবহার করা উচিত:

find . -type d \! -execdir sh -c 'test -e {}/*.ENDING' \; -print

এই স্থাপিত হবে SH বিস্তৃত *.ENDINGযখন পরীক্ষা মৃত্যুদন্ড কার্যকর করা হয়।

উত্স: ইউএক্স.এসইতে গ্লোববিং সন্ধান করুন


কাজ করে না. আমি পেতে নিম্নলিখিত ত্রুটি: SH: -c: line 0: syntax error near unexpected token ( '' আমার ডিরেক্টরির নাম বিন্যাস আছে। 'Xyz (dfdf)' বস্তুত তার একটি ধীশক্তি
বাঁশ

1
আমি এটি চেষ্টা করার পরে, আমি sh: line 0: test: foo1/bar.ENDING: binary operator expectedসমাপ্তি সহ একটি ফাইল ধারণকারী ডিরেক্টরিতে পাই ENDING
জেনি ডি

এটি আমার পক্ষে সরল a.ENDING ফাইলের নামগুলির সাথে কাজ করছে বলে মনে হচ্ছে
ব্যবহারকারী 9517

আমার নিম্নলিখিত পরীক্ষার ডিরেক্টরি কাঠামো রয়েছে: টেস্ট-> পরীক্ষা (পরীক্ষা) -> sh: -c: line 0: syntax error near unexpected token পরীক্ষা ending / পরীক্ষা (টেস্ট) `কিন্তু আমি যখন কারন আমি ডিরেক্টরির নামের মঞ্জুর-আছে আমি একই ফলাফল পেতে এই .xyz করার .ending পরিবর্তন করেন, ডান আমি কিভাবে যে ঠিক করতে পারেন।।?
বাঁশ

3
@ বাঁশ আমি শেল ইউটিলিটিগুলি ছেড়ে দেব এবং এই মুহুর্তে একটি আলাদা সমাধান সন্ধান করব।
ব্যবহারকারী 9517

2

ডেনিস নল্টে এবং মিকিবিয়ের উত্তরগুলি দ্বারা অনুপ্রাণিত হয়ে আমি এই সমাধানটি নিয়ে এসেছি:

find . -type d                                                           \
  \! -exec bash -c 'shopt -s failglob; echo "{}"/*.ENDING >/dev/null' \; \
  -print 2>/dev/null

এটি বাস্তবের ভিত্তিতে কাজ করে

যদি ফেলগ্লোব শেল বিকল্পটি সেট করা থাকে এবং কোনও মিল খুঁজে পাওয়া যায় না, একটি ত্রুটি বার্তা মুদ্রিত হয় এবং কমান্ডটি কার্যকর হয় না।

যাইহোক, এজন্যই স্ট্যাডারকে পুনঃনির্দেশিত করা হয়েছিল /dev/null


1

আমি ব্যক্তিগতভাবে এটি perl মধ্যে করব

#!/usr/bin/perl

use strict;
use warnings;

use File::Find;


#this sub is called by 'find' on each file it traverses. 
sub checkdir {
    #skip non directories. 
    return unless ( -d $File::Find::name );

    #glob will return an empty array if no files math - which evaluates as 'false'
    if ( not glob ( "$File::Find::name/*.ENDING" ) ) {
        print "$File::Find::name does not contain any files that end with '.ENDING'\n";
    }
}

#kick off the search on '.' - set a directory path or list of directories to taste.
#  - you can specify multiple in a list if you so desire. 
find (  \&checkdir, "." );

কৌশলটি করা উচিত (আমার খুব সরল পরীক্ষার ক্ষেত্রে কাজ করে)।


0

এখানে একটি ওয়ান লাইনার সন্ধান করুন।

find ./ -type d ! -regex '.*.ENDING$' -printf "%h\n" | sort -u

সম্পাদনা : উফ, কাজ করবে না।


এটি কাজ করে না কারণ আপনি ডিরেক্টরিগুলির নামগুলি পরীক্ষা করছেন, তাদের ভিতরে থাকা ফাইলগুলির নয়।
ক্রিশ্চিয়ান সিউপিতু

আমি আবার চেষ্টা করেছি। খারাপভাবে
ম্যাথু আইফে

0
find . -type d '!' -exec sh -c 'ls -1 "{}"|egrep -q "*ENDING$"' ';' -print
  • q egrep শান্ত জন্য হয়

  • সঙ্গে egrepআপনি Regex যে আপনি প্রয়োজন অদলবদল করতে পারেন

  • ls -1 "{}" ফাইন্ড কমান্ড থেকে ফাইলের নাম আউটপুট করে

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