ইউনিক্সে নির্দিষ্ট এক্সটেনশনে শেষ না হওয়া ফাইলের নামগুলি সন্ধান করবেন?


207

ডিরেক্টরি হায়ারার্কিতে সমস্ত ফাইল পুনরাবৃত্তভাবে সন্ধান করার কি সহজ উপায় আছে, যা এক্সটেনশনের তালিকায় শেষ হয় না ? যেমন সমস্ত ফাইল যা * .dll বা * .exe নয়

ইউনিক্স / জিএনইউ সন্ধান করুন, এটি যেমন শক্তিশালী, তেমন একটি excludeমোড রয়েছে বলে মনে হয় না (বা আমি এটি মিস করছি), এবং কোনও নির্দিষ্ট এক্সপ্রেশনটির সাথে মেলে না এমন জিনিসগুলি খুঁজে পেতে আমি নিয়মিত অভিব্যক্তি ব্যবহার করা সবসময়ই কঠিন বলে মনে করি

আমি একটি উইন্ডোজ পরিবেশে আছি ( বেশিরভাগ জিএনইউ সরঞ্জামগুলির GnuWin32 বন্দর ব্যবহার করে ), তাই আমি উইন্ডোজ-কেবলমাত্র সমাধানের জন্য সমানভাবে উন্মুক্ত।

উত্তর:


343

বা ছাড়া (এবং এড়াতে হবে:

find . -not -name "*.exe" -not -name "*.dll"

এবং ডিরেক্টরি তালিকা বাদ দিতে

find . -not -name "*.exe" -not -name "*.dll" -not -type d

অথবা ইতিবাচক যুক্তিতে ;-)

find . -not -name "*.exe" -not -name "*.dll" -type f

6
-notদ্বারা প্রতিস্থাপন করা যেতে পারে '!'(উদ্ধৃতি প্রস্তাবিত)। অন্যদিকে, -nameকেস সংবেদনশীল তবে -inameকেস সংবেদনশীল।
ইভান চৌউ


8
$ find . -name \*.exe -o -name \*.dll -o -print

প্রথম দুটি-নামের বিকল্পগুলিতে প্রিন্টের বিকল্প নেই, তাই তারা এড়িয়ে গেল। বাকি সব ছাপানো আছে।


4

আপনি গ্রেপ কমান্ডটি ব্যবহার করে কিছু করতে পারেন:

find . | grep -v '(dll|exe)$'

-vফ্ল্যাগ grepবিশেষভাবে মানে "যে জিনিস খুঁজে না এই মত প্রকাশের সাথে মেলে না।"


6
, grep -v '\ (Dll | EXE) $।' ফাইল বা Dir নামে উদাহরণস্বরূপ "dexe" againsta ম্যাচিং প্রতিরোধ করবে
drAlberT

এটি কেবল বর্ধিত রিজেক্সের সাথে কাজ করে। এই কাজটি করতে আমাকে -E (বা egrep ব্যবহার) করতে হয়েছিল।
জেটি

2

আরো একটা :-)

s ls -ltr
মোট 10
-rw-r - r-- 1 স্ক্রিপ্টর লিনাক্সডম্ব 47 ডিসেম্বর 23 14:46 পরীক্ষা 1
-rw-r - r-- 1 স্ক্রিপ্টর লিনাক্সডাম্ব 0 জানুয়ারী 23 23:40 পরীক্ষা 4
-rw-r - r-- 1 স্ক্রিপ্টর লিনাক্সডাম্ব 0 জানুয়ারী 23 23:40 পরীক্ষা 3
-rw-r - r-- 1 স্ক্রিপ্টর লিনাক্সডাম্ব 0 জানুয়ারী 23 23:40 পরীক্ষা 2
-rw-r - r-- 1 স্ক্রিপ্টর লিনাক্সডামব 0 জানুয়ারী 23 23:41 ফাইল 5
-rw-r - r-- 1 স্ক্রিপ্টর লিনাক্সডামব 0 জানুয়ারী 23 23:41 ফাইল4
-rw-r - r-- 1 স্ক্রিপ্টর লিনাক্সডামব 0 জানুয়ারী 23 23:41 ফাইল 3
-rw-r - r-- 1 স্ক্রিপ্টর লিনাক্সডামব 0 জানুয়ারী 23 23:41 ফাইল 2
-rw-r - r-- 1 স্ক্রিপ্টর লিনাক্সডামব 0 জানুয়ারী 23 23:41 ফাইল 1
আমি খুঁজে। টাইপ চ! -নাম "* 1"! নাম "* 2" -প্রিন্ট
./test3
./test4
./file3
./file4
./file5
$

ইউনিক্স কমান্ড রেফারেন্স সন্ধান করুন



1

লিনাক্স / ওএস এক্স:

বর্তমান ডিরেক্টরি থেকে শুরু করে, পুনরাবৃত্তভাবে .dll বা .exe এ শেষ হওয়া সমস্ত ফাইল সন্ধান করুন

find . -type f | grep -P "\.dll$|\.exe$"

বর্তমান ডিরেক্টরি থেকে শুরু করে, পুনরাবৃত্তভাবে সমস্ত ফাইল সন্ধান করুন যা .dll বা .exe এ শেষ হয় না

find . -type f | grep -vP "\.dll$|\.exe$"

মন্তব্য:

(1) গ্রেপের পি বিকল্পটি ইঙ্গিত করে যে আমরা গ্রেপ কমান্ডের সাথে ব্যবহার করতে আমাদের নিয়মিত এক্সপ্রেশন লিখতে পার্ল স্টাইলটি ব্যবহার করছি । Excecuting উদ্দেশ্য পূরণকল্পে , grep রেগুলার এক্সপ্রেশনের সাথে কমান্ড আমি দেখি যে পার্ল শৈলী সবচেয়ে শক্তিশালী শৈলী প্রায়।

(২) গ্রেপ-এর ভি বিকল্পটি শেলকে নিয়মিত এক্সপ্রেশনটি সন্তুষ্ট করে এমন কোনও ফাইল বাদ দিতে নির্দেশ দেয়

(3) ".dll $" বলার শেষে $ অক্ষরটি একটি সীমান্ত নিয়ন্ত্রণ অক্ষর যা শেলকে বলে যে ফাইলের নাম স্ট্রিং ".dll" দিয়ে শেষ হয়


0

আপনার এক্সটেনশনের দীর্ঘ তালিকা থাকলে - এই পৃষ্ঠার অন্যান্য সমাধানগুলি আকাঙ্ক্ষিত নয় - এর দীর্ঘ ক্রম বজায় রাখা -not -name 'this' -not -name 'that' -not -name 'other'ক্লান্তিকর এবং ত্রুটি-ঝুঁকির কারণ হতে পারে - বা যদি অনুসন্ধান প্রোগ্রামিয়াত হয় এবং এক্সটেনশনের তালিকা রানটাইমের সময় নির্মিত হয়।

এই পরিস্থিতিতেগুলির জন্য, এমন কোনও সমাধান যা ডেটা (এক্সটেনশনের তালিকা) এবং কোডকে আরও স্পষ্ট করে আলাদা করে দেয় (প্যারামিটারগুলি find) হতে পারে। এমন একটি ডিরেক্টরি এবং ফাইল কাঠামো দেওয়া হয়েছে যা এর মতো দেখাচ্ছে:

.
└── a
    ├── 1.txt
    ├── 15.xml
    ├── 8.dll
    ├── b
    │   ├── 16.xml
    │   ├── 2.txt
    │   ├── 9.dll
    │   └── c
    │       ├── 10.dll
    │       ├── 17.xml
    │       └── 3.txt
    ├── d
    │   ├── 11.dll
    │   ├── 18.xml
    │   ├── 4.txt
    │   └── e
    │       ├── 12.dll
    │       ├── 19.xml
    │       └── 5.txt
    └── f
        ├── 13.dll
        ├── 20.xml
        ├── 6.txt
        └── g
            ├── 14.dll
            ├── 21.xml
            └── 7.txt

আপনি এর মতো কিছু করতে পারেন:

## data section, list undesired extensions here
declare -a _BADEXT=(xml dll)

## code section, this never changes
BADEXT="$( IFS="|" ; echo "${_BADEXT[*]}" | sed 's/|/\\|/g' )"
find . -type f ! -regex ".*\.\($BADEXT\)"

যার ফলাফল:

./a/1.txt
./a/b/2.txt
./a/b/c/3.txt
./a/d/4.txt
./a/d/e/5.txt
./a/f/6.txt
./a/f/g/7.txt

কোড ব্লক পরিবর্তন না করে আপনি এক্সটেনশানগুলির তালিকা পরিবর্তন করতে পারেন।

বিঃদ্রঃ নেটিভ ওএসএক্সের সাথে কাজ করে না find- পরিবর্তে gnu সন্ধান করুন।

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