উত্তর:
জিএনইউ find
এবং এর উপর ভিত্তি করে এখানে সম্পূর্ণ আলাদা পদ্ধতির রয়েছে uniq
। শেল কমান্ড নির্বাহের উপর ভিত্তি করে দেওয়া উত্তরগুলির তুলনায় এটি আরও দ্রুত এবং অনেকগুলি সিপিইউ-বান্ধব যা প্রতিটি ডিরেক্টরিতে পাওয়া ফাইলগুলির জন্য গণনা করে।
find . -type f -printf '%h\n' | sort | uniq -d
find
কমান্ড অনুক্রমের সব ফাইল নির্দেশিকা ছাপে এবং uniq
শুধুমাত্র ডিরেক্টরি যে দুইবার কমপক্ষে প্রদর্শিত প্রদর্শন করা হয়।
-printf '%h\0' | sort -z | uniq -zd | xargs -r0 ...
find . -type d \
-exec sh -c 'c=0; for n in "$1"/*; do [ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 )); done; [ "$c" -ge 2 ]' sh {} ';' \
-print
এটি বর্তমান ডিরেক্টরিতে বা এর অধীনে সমস্ত নাম খুঁজে পাবে এবং তারপরে ডিরেক্টরিগুলির নাম নয় এমন সমস্ত নাম ফিল্টার করে ফেলবে।
অবশিষ্ট ডিরেক্টরি নামগুলি এই সংক্ষিপ্ত স্ক্রিপ্টে দেওয়া হবে:
c=0
for n in "$1"/*; do
[ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 ))
done
[ "$c" -ge 2 ]
এই স্ক্রিপ্টটি প্রথম কমান্ড লাইন আর্গুমেন্ট (থেকে find
) হিসাবে প্রদত্ত ডিরেক্টরিটিতে নিয়মিত ফাইলগুলির (প্রতীকী লিঙ্কগুলি এড়িয়ে যাওয়া) গণনা করবে । স্ক্রিপ্টের শেষ কমান্ডটি পরীক্ষাটি যা পরীক্ষা করা হয় তা গণনা 2 বা তার বেশি ছিল কিনা to এই পরীক্ষার ফলাফল হ'ল স্ক্রিপ্টের রিটার্ন মান (প্রস্থান স্থিতি)।
যদি পরীক্ষাটি সফল হয়, তবে ডিরেক্টরিটির পাথ মুদ্রণ -print
করবে find
।
লুকানো ফাইলগুলি (ফাইলগুলির নাম যার সাথে ডট দিয়ে শুরু হয়) বিবেচনা করতে, sh -c
স্ক্রিপ্টটি বলা থেকে পরিবর্তন করুন
for n in "$1"/*; do
প্রতি
for n in "$1"/* "$1"/.*; do
পরীক্ষামূলক:
$ tree
.
`-- test
|-- a
|-- dir1
| |-- a
| |-- b
| `-- c
`-- dir2
|-- dira
|-- dirb
| |-- file-1
| `-- file-2
`-- dirc
6 directories, 6 files
$ find . -type d -exec sh -c 'c=0; for n in "$1"/*; do [ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 )); done; [ "$c" -ge 2 ]' sh {} ';' -print
./test/dir1
./test/dir2/dirb
[ "" -ge 2 ]
বৈধ পরীক্ষা হওয়ার কারণে কোনও ডিরেক্টরিতে নিয়মিত ফাইল না থাকলে কোনও ত্রুটি নেই ।
dash
, bash --posix
এবং test
সমস্ত একটি ত্রুটি বার্তা প্রদর্শন করে 2 (যেমন "একটি ত্রুটি ঘটেছে") দিয়ে
ksh
চলছে sh
। অবিলম্বে সংশোধন করবে। আমার দিকে তাকানোর জন্য ধন্যবাদ! :-)
[ -f ... ]
প্রতীকী লিঙ্কগুলি dereferences। এগুলি নির্মূল করার জন্য আপনার একটি পরীক্ষা করা উচিত কারণ প্রশ্নটি নির্দিষ্ট করে যে কেবল নিয়মিত ফাইলগুলি গণনা করা উচিত।
সাহায্যে গিলেজ এর উত্তর উপর SU এবং তার বিপরীত কিছু পরিমার্জন, আপনি যা প্রয়োজন।
find . -type d -exec sh -c 'set -- "$1"/*;X=0;
for args; do [ -f "$args" ] && X=$((X+1)) ;done; [ "$X" -gt 1 ] ' _ {} \; -print
ডিরেক্টরি গাছ।
.
├── test
│ ├── dir1
│ │ ├── a
│ │ ├── b
│ │ └── c
│ ├── dir2
│ │ ├── dira
│ │ │ └── a file\012with\012multiple\012line
│ │ ├── dirb
│ │ │ ├── file-1
│ │ │ └── file-2
│ │ └── dirc
│ ├── diraa
│ ├── dirbb
│ ├── dircc
│ └── x
│ └── x1
│ └── x2
└── test2
├── dir3
└── dir4
ফলাফল:
./test
./test/dir1
./test/dir2/dirb
test
এবং dir2
ডিরেক্টরিগুলি উভয়ই সন্ধান করে (আমার উত্তর দেখুন)।
test/x1
এবং test/x2
ফাইল সেইসাথে ... $1
এবং $2
জন্য ডিরেক্টরি হতে হবে test
, এবং ডিরেক্টরির মিস করা হবে।
অন্য find
+ wc
পদ্ধতির:
find path/currdir -maxdepth 1 -type d ! -empty ! -path "path/currdir" \
-exec sh -c 'count=$(find "$1" -maxdepth 1 -type f | wc -l); [ $count -ge 2 ]' _ {} \; -print
path/currdir
- আপনার বর্তমান ডিরেক্টরিতে পাথ
-maxdepth 1
- কেবল সরাসরি শিশু সাবফোল্ডার বিবেচনা করুন
! -empty
- খালি সাবফোল্ডারগুলি উপেক্ষা করুন
! -path "path/currdir"
- বর্তমান ডিরেক্টরি পাথ উপেক্ষা করুন
count=$(find "$1" -maxdepth 1 -type f | wc -l)
- count
প্রতিটি পাওয়া সাবফোল্ডার ফাইলের সংখ্যা নির্ধারিত হয়
[ $count -ge 2 ] ... -print
- 2 বা ততোধিক নিয়মিত ফাইল সহ সাবফোল্ডার নাম / পাথ মুদ্রণ করুন
find
। এই ক্ষেত্রে, কারণ জিএনইউfind
বর্তমান ডিরেক্টরিতে মুদ্রণযোগ্য নয় এমন অক্ষরের রয়েছে এমন ডিরেক্টরিগুলির নাম ছড়িয়ে দেবে (সি লোকালে "ä" এর মতো)। এছাড়াও দেখুন unix.stackexchange.com