ডিরেক্টরিতে ফাইলগুলির জন্য, কেবল ইকো ফাইলের নাম (কোনও পথ নেই)


100

আমি যদি কোনও লুপের জন্য কোনও ডিরেক্টরিকে পুনরাবৃত্তি করি তবে কেবলমাত্র একটি ফাইলের ফাইলের নাম প্রতিধ্বনি সম্পর্কে কী করব?

for filename in /home/user/*
do
  echo $filename
done;

ফাইলের নাম সহ পুরো পথটি টানবে। আমি শুধু ফাইলের নাম চাই।

উত্তর:


168

আপনি যদি একটি দেশীয় bashসমাধান চান

for file in /home/user/*; do
  echo "${file##*/}"
done

উপরের অংশগুলিতে প্যারামিটার এক্সপেনশন ব্যবহার করা হয় যা শেলের আদি এবং এটি কোনও বাহ্যিক বাইনারি যেমন কল প্রয়োজন হয় নাbasename

তবে, আমি কেবল ব্যবহার করার পরামর্শ দিতে পারি find

find /home/user -type f -printf "%f\n"

9
ভাল উত্তর. প্যারামিটার সম্প্রসারণ সম্পর্কে আরও শিখতে আগ্রহীদের জন্য
ডগডাব্লু

4
-প্রিন্টফ: অজানা প্রাথমিক বা অপারেটর => unix.stackexchange.com/a/272493/72893
অরেলিও

4
স্থানগুলির সাথে ফাইলের নামগুলি সমর্থন ${file##*/}করতে পরিবর্তনগুলি বিবেচনা করুন "${file##*/}"যেমন "স্পেস.টেক্সট সহ আমার ফাইল নাম"।
উইনউইউউকস 2 ইউনিক্স

4
প্রতিধ্বনি "$ {ফাইল ## * /}" খালি স্ট্রিং দেয়
আলেসান্দ্রো সি

48

শুধু ব্যবহার করুন basename:

echo `basename "$filename"`

ফাইলের নাম যেমন শূন্যস্থান রয়েছে সে ক্ষেত্রে উদ্ধৃতিগুলি প্রয়োজনীয়।


4
প্যারামিটার সম্প্রসারণ ব্যবহার করা আরও ভাল, বাহ্যিক বাইনারিগুলিতে কোনও কল করার প্রয়োজন নেই।
সিজিএক্সএক্স

4
বিটিডব্লিউ, `` হ্রাস করা হয়েছে। $()অলির মতো ব্যবহার করা আরও ভাল
সিজেএক্সএক্স

4
এই পুরানো উত্তর সম্পর্কে মন্তব্য করার জন্য দুঃখিত, কিন্তু বেসনাম স্থান সহ ফাইলগুলির জন্য সঠিকভাবে কাজ করবে না। উদাহরণ: PWD আউটপুট: /test 1, basename $(pwd)আউটপুট: test। ওএস এক্স এবং উবুন্টু সার্ভারে পরীক্ষিত (14.04)। নেটিভ বাশ সলিউশন, যেমন @ সিজেএক্সএক্স প্রস্তাবিত, আমার পক্ষে কাজ করেছে।
মার্কো গ্রেভাক

basename "$(pwd)"পরিবর্তে @ মার্কোগ্রিক ব্যবহার করুন।
ইয়ংফ্রোগ

@ ইউংফ্রোগ ইনপুটটির জন্য ধন্যবাদ, তবে এটি 9 মাস আগে ছিল। $PWDকমান্ড চালানোর পরিবর্তে ভেরিয়েবল ব্যবহার করা ভাল ।
মার্কো গ্রিক

16

ব্যবহার basename:

echo $(basename /foo/bar/stuff)

আপনি কেন ব্যবহার করবেন echo? basenameইতিমধ্যে ফলাফল মুদ্রণ। echoএমনকি যদি আপনি সাব-শেলটি উদ্ধৃতি না করেন তবে ফলাফলটি ম্যাঙ্গেলও করতে পারে। উদাহরণ: echo $(basename path/with\ \ spaces)ভুলভাবে মুদ্রণ with spaces(একমাত্র স্থান)।
সোসোইই

8

lsডিরেক্টরিতে ফাইল তালিকাটি পড়ার সময় আরেকটি পদ্ধতির ব্যবহার হ'ল যাতে আপনি যা চান তা দিতে পারেন, যেমন "কেবলমাত্র ফাইলের নাম / গুলি"। সম্পূর্ণ ফাইল পাথটি পড়ার বিরোধিতা এবং তারপরে ফর লুপের শরীরে "ফাইলের নাম" উপাদানটি বের করা।

এর নীচে উদাহরণগুলি আপনার আসলটি অনুসরণ করে:

for filename in $(ls /home/user/)
do
  echo $filename
done;

আপনি যদি ফাইলগুলির মতো একই ডিরেক্টরিতে স্ক্রিপ্টটি চালাচ্ছেন তবে তা কেবল হয়ে যায়:

for filename in $(ls)
do
  echo $filename
done;

4
lsএমন কোনও ডটফাইল অন্তর্ভুক্ত রয়েছে যেখানে *প্রসার সাধারণত হয় না। এছাড়াও for f in $(...) ...ব্যর্থ কোনো ফাইলের নাম হোয়াইটস্পেস যদি না আপনি IFS সেট, ব্যর্থ হতে পারে যদি থাকে ফাইলের নাম যদি না আপনি -f / -o noglob সেট করুন, এবং সিস্টেম বা শেল উপর নির্ভর করে একটি উল্লিখিত glob গৃহস্থালির কাজ রয়েছে থাকে echoযদি থাকে ফাইলের নাম হাইফেন + অক্ষর বা ব্যাকস্ল্যাশ রয়েছে বিফল হতে পারে। OTOH কেবল ls -1 /path/to/dirনিজেরাই প্রতিটি ফাইলের নাম একটি লাইনে নির্ভরযোগ্যভাবে মুদ্রণ করে, ডটফাইলের পার্থক্যকে মডিউল করে।
ডেভ_থমপসন_085

0

আপনি যদি কেবল ফাইলের নাম চান:

for file in /home/user/*; do       
  f=$(echo "${file##*/}");
  filename=$(echo $f| cut  -d'.' -f 1); #file has extension, it return only filename
  echo $filename
done

cutকমান্ড সম্পর্কে আরও তথ্যের জন্য এখানে দেখুন

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