'ls -1': কীভাবে এক্সটেনশন ছাড়াই ফাইলের নাম তালিকাভুক্ত করা যায়


24

ls -1 আমার উপাদানগুলি এর মতো তালিকাবদ্ধ করে:

foo.png
bar.png
foobar.png
...

আমি এটি .pngপছন্দ না করে তালিকাবদ্ধ করতে চাই:

foo
bar
foobar
...

(দির কেবল .pngফাইল রয়েছে )

grepএই ক্ষেত্রে কীভাবে ব্যবহার করতে হবে কেউ আমাকে বলতে পারেন ?

উদ্দেশ্য: আমার কাছে একটি পাঠ্য ফাইল রয়েছে যেখানে এক্সটেনশন ছাড়াই সমস্ত নাম তালিকাভুক্ত করা হয়েছে। আমি কোনও স্ক্রিপ্ট তৈরি করতে চাই যা ফোল্ডারের সাথে পাঠ্য ফাইলটির সাথে তুলনা করে কোন ফাইলটি অনুপস্থিত রয়েছে তা দেখতে।


36
আপনি এই মত একটি অনুরোধ সতর্কতা অবলম্বন করতে চান। লিনাক্সের ফাইল নাম এক্সটেনশন নেই। লিনাক্সের ফাইলের নাম রয়েছে যা সেগুলির .মধ্যে অন্তর্ভুক্ত থাকতে পারে বা নাও পারে । যদিও সম্মেলন সঙ্গে আপনার ফাইল নাম বলছেন .pngশেষে, কোন কারণে আমি একটি PNG ফাইল নামে থাকতে পারে না হয় foo.zipবা my.picture.20160518বা শুধু mypic
hymie

2
@ হিমি আমি জানি, কিন্তু সেই ফোল্ডারে থাকা আমার উপাদানগুলির নামগুলি শেষের দিকে .png দিয়ে দেওয়া আছে।
কলিন

14
একটি "এক্সটেনশন" কি? এটি ইউনিক্স ফাইল নামকরণের অংশ নয়; এটি ভিএমএস / এনটি / উইন্ডোজ যাই হোক না কেন থেকে ক্যারিওভার। এবং আপনি যুবকরাও আমার লন থেকে নামেন। :)
এমপিএজ 0

28
আসুন আমরা এটাকে বড় করে দেখি না। ওএস এক্সটেনশানগুলিকে কেবল ফাইল নামের অংশ হিসাবে বিবেচনা করে, তবে সংকলক থেকে জিইআইতে প্রচুর ইউনিক্স প্রোগ্রাম এগুলিতে মনোযোগ দেয়। ধারণাটি অবশ্যই ইউনিক্সের জন্য বিদেশী নয়।
Alexis

1
এটি সাধারণত করার পরামর্শ দেওয়া হয় এড়ানোর আউটপুট পার্স করতেls এবং আউটপুট নল থেকে lsএবং findপ্রধানত কারণ সম্ভাবনা মধ্যে বহন করতে newlineফাইল নামে, `ট্যাব গৃহস্থালির কাজ। ফাইলনাম The new art of working on .png\NEWLINE files and other formatsপ্রস্তাবিত সমাধানের অনেকগুলি হলে সমস্যা তৈরি হবে।
হাস্তুর

উত্তর:


41

এই কাজের জন্য আপনার কেবল শেল দরকার।

POSIXly:

for f in *.png; do
    printf '%s\n' "${f%.png}"
done

সাথে zsh:

print -rl -- *.png(:r)

4
এর দরকার নেই printf; echo ${f%.png}যথেষ্ট হবে.
ডেভিড কনরাড

11
@ কনরাড: ফাইল নাম যদি ড্যাশ দিয়ে শুরু হয় বা পালানো সিকোয়েন্স থাকে তবে কিছু ক্ষেত্রে ইকো ব্যবহার করা সঠিকভাবে কাজ করবে না।
cuonglm


35
ls -1 | sed -e 's/\.png$//'

sedকমান্ড অপসারণ (যে, এটা খালি স্ট্রিং সঙ্গে প্রতিস্থাপন) কোন স্ট্রিং .pngএ পাওয়া শেষ একটি ফাইল আছে।

.যেমন পলান হয় \.যাতে এটি দ্বারা ব্যাখ্যা করা হয় sedএকটি আক্ষরিক যেমন .regexp বদলে চরিত্র .(যার মানে কোন অক্ষর মেলে)। $তাই এটি মেলে না, শেষ অফ লাইন নোঙ্গর হয় .pngএকটি ফাইল মাঝখানে।


4
আমি মনে করি যে ওপি কোনও এক্সটেনশন ছিনিয়ে নিতে চায় , তবে সম্ভবত কেবল "শেষের"। সুতরাং সম্ভবত আপনার অন্যথায় ভাল উত্তরটি এর সাথে সংশোধন করুন:sed 's/\.[^.]*$//'
ওথিয়াস

1
হ্যাঁ, এই রেজিএক্সপ্যাক সেই ক্ষেত্রে কাজ করবে ... তবে ওপি যদি তা চায়, তবে তারা "স্পষ্টভাবে এটি .png ছাড়া তালিকাভুক্ত করতে চান" বলে নির্দিষ্ট করে বলার পরিবর্তে তাই বলা উচিত
ক্যাস

4
-1ডিফল্ট এখানে হচ্ছে প্রয়োজন হয় না।
jlliagre

3
@jlliagre আমি ক্যাসের সাথে একমত যেগুলি -1নির্দিষ্ট করা উচিত। পাইপ চালু করা হলে এটি কেবলমাত্র ডিফল্ট, যা কারও কারও কাছে একটি গোপন আশ্চর্য বিষয়। সুতরাং এটি সুস্পষ্ট করা বুঝতে সাহায্য করে। আমি আমার স্ক্রিপ্টগুলিতেও এটি করি তাই আমি জানি যে আমি কী ধরণের আউটপুট আশা করি।
ওথিয়াস

1
সতর্কতা.png একটি নতুন লাইনের চর আগে কী ( ) দিয়ে ফাইলের ক্ষেত্রে আপনি এটি এমনকি শেষটিকেই মুছবেন .pngone Ls এর আউটপুটটি পাইপ করা এবং পার্স করা এড়ানো ভাল, এটি প্রায়শই ভাল আড়াল করা চমক রাখে ... (উত্তরে কিছু শব্দ এবং রেফারেন্স)।
হাস্তুর

16

আপনি যদি কেবল ব্যাশ ব্যবহার করতে চান:

for i in *; do echo "${i%.png}"; done

grepম্যাচগুলি সন্ধান করার সময় আপনার পৌঁছানো উচিত , এর জন্য অপসারণ / প্রতিস্থাপনের জন্য নয় বরং এটি sedআরও উপযুক্ত:

find . -maxdepth 1 -name "*.png"  | sed 's/\.png$//'

একবার আপনি সিদ্ধান্ত নিলে আপনার পিএনজি ফাইলে অর্ডার আনার জন্য আপনাকে কয়েকটি উপ-ডিরেক্টরি তৈরি করতে হবে আপনি সহজেই এটিকে এতে পরিবর্তন করতে পারবেন:

find . -name "*.png"  | sed 's/\.png$//'

ls -1 | sed 's / .png //' দুর্দান্ত কাজ করে। ধন্যবাদ!
কলিন

find পাইপ থেকে sedসমাধান কিছু সমস্যা উপস্থাপন যদি আপনি কী (সহ একটি ফাইল খুঁজে পেতে পারেন .png) নামের একটি অংশ হিসাবে এবং মাত্র একটি newline অক্ষর আগে। এটা তোলে পাইপ এড়ানো এবং আউটপুট পার্স করতে উত্তম findবা lsএটা প্রায়ই ভাল লুকানো চমকের ... (কিছু শব্দ এবং তথ্যসূত্র উত্তরে বেশি) সংরক্ষণ করে।
হাস্তুর

সম্ভবত শেষ উদাহরণের findমতো কিছু দিয়ে প্রতিস্থাপন করুন echo। কী উদ্দেশ্য findসেখানে কাজ করে তা পরিষ্কার নয় এবং ফলাফল ডিরেক্টরি কাঠামোর উপর নির্ভর করে (যেমন আপনার যদি ডিরেক্টরি থাকে files.png)

@ ব্রোস্লো আরও বুদ্ধিমান কিছুতে আপডেট হয়েছে।
অ্যান্থন

13

আমি basename(জিএনইউ বাস্তবায়ন অনুমান করে) যেতে চাই :

basename --suffix=.png -- *.png

নোট করুন যে আপনি যদি এটি কোনও পাইপে ব্যবহার করতে চান তবে NN- বিচ্ছিন্ন (নিউলাইন-বিচ্ছিন্নের পরিবর্তে) আউটপুট উত্পাদনের জন্য আপনি GNU বেসনামের -z(বা --zero) বিকল্পটি ব্যবহার করতে সহায়ক হতে পারেন ।
টবি স্পিড

11

আরও একটি অনুরূপ উত্তর (আমি বিস্মিত এই বিশেষ রূপটি এখনও উপস্থিত হয়নি) হ'ল:

ls | sed -n 's/\.png$//p'
  • আপনার -1বিকল্পের দরকার নেই ls, যেহেতু lsধরে নেওয়া হয় যে যদি স্ট্যান্ডার্ড আউটপুটটি টার্মিনাল না হয় (এটি এই ক্ষেত্রে একটি পাইপ)।
  • -nবিকল্পsed মানে 'ডিফল্ট ভাবে লাইন প্রিন্ট না'
  • /pপ্রতিকল্পন উপায়ে শেষে বিকল্পটি '... এবং একটি প্রতিকল্পন হয়েছিল এই লাইন প্রিন্ট'।

যে নিট প্রভাব কেবল যারা লাইন যেখানে শেষ, প্রিন্ট আউট হয় .png, সঙ্গে .pngসরানো হয়েছে। এটি, এটি ওপি-র প্রশ্নের সামান্য সাধারণীকরণকেও সরবরাহ করে, যেখানে ডিরেক্টরিটি কেবল থাকে না.png ফাইল ।

sed -nকৌশল যেখানে আপনি অন্যথায়, grep ব্যবহার হতে পারে + + sed প্রায়ই ক্ষেত্রে সহায়ক।


আমি পছন্দ করি আপনি কীভাবে আপনার উত্তরটি লিখতেন। এই সমাধানটি নিউলাইনগুলি সহ ফাইলের নামগুলির সাথে সমস্যাগুলি উপস্থাপন করবে , এটি নামের প্রথম অংশটি প্রিন্ট করবে না। আরও বেশি যদি এটি .pngনিউলাইন চরের আগে কী ( ) এর সাথে সর্বাগ্রে জড়িত থাকে: সেক্ষেত্রে আপনি সেই অংশটি পিএনজি ছাড়াই মুদ্রণ করবেন, কেবল শেষ অংশটি মুছবেন না। এর আউটপুট পার্স (এবং পাইপ) এড়াতে এড়াতে প্রায়শই এটির পরামর্শ দেওয়া হয় lsকারণ আপনি যেখানে ভাবছেন না সেখানেই সমস্যাগুলি লুকিয়ে রাখা যেতে পারে ...
হাস্তুর

2
@ হাস্তুর আপনি নীতিগতভাবে সঠিক, এবং প্যাথলজিকাল ফাইল নামগুলি হস্তান্তর করার সময় বিশ্লেষণের জন্য বিখ্যাত পৃষ্ঠাতে আরও সমস্যা (এবং সমাধান) তালিকাভুক্ত করা হয়। তবে হ্যান্ডলিংয়ের সর্বোত্তম উপায় হ'ল প্যাথোলজিকাল ফাইল নাম (দোহ!) এড়ানো to এবং যদি আপনি বা করতে পারেন না, আপনি যদি উচিত নয় তাদের বিরুদ্ধে জোরালো হয় তবে পারেন ব্যবহার findবা - সম্ভবত ভালো - একটি অধিক শক্তিশালী ভাষা ব্যবহার তুলনায় shসেগুলিকে পরিচালনা করার জন্য (সত্য যে sh পারেন সবকিছু করতে অর্থ এই নয় যে এটা সবচেয়ে ভাল পছন্দ প্রত্যেক ঘটনা). শেলটি প্রথমে ব্যবহারের জন্য তৈরি করা হয়েছে।
নরম্যান গ্রে

নীতিগতভাবে, ব্যবহারযোগ্যতা সম্পর্কে আমি সম্মত, কিন্তু যখন প্রতিটি নতুন লাইনের ভিতরে আপনার ফাইলের নাম থাকে তখন এই রূপটি ব্যর্থ হয় । এটি সহজেই অলক্ষিত হয়ে উঠতে পারে, উদাহরণস্বরূপ, আপনি যখন কোনও জিডিআইতে পিডিএফ থেকে একটি লাইন অনুলিপি করে আটকান, তখন আপনি কেবল প্যাথোলজিকাল ফাইলের নাম এড়ানো হবে বলে মনে করেন ।
হাস্তুর

তবুও আইএমএইচও এটি পার্স করা সহজ হয় lsতবে এটি ভবিষ্যতের সমস্যাগুলির অনেক আগে। প্রায়শই আমরা স্ক্রিপ্টগুলি তৈরি করি যা আমরা পরে ব্যবহার করব, যখন আমরা ইতিমধ্যে তাদের সীমাটি ভুলে যাব ... (এটি মানব, এটি স্বাভাবিক)। আমি একটি উদাহরণ প্রস্তাব করেছি find( -execপাইপ সহ এবং তার বাইরে) এমনকি যদি আমি আরও ভাল বলে মনে করি (কারণ খাঁটি শেল) কিউংএলএমের একটির শক্ত, উত্তর এবং অনুমানযুক্ত অনুগত answer
হাস্তুর

@ হাস্তুর: ভবিষ্যতের সমস্যাগুলি যেভাবেই উঠবে। সিস্টেমে প্রচুর জিনিস নিউলাইনযুক্ত ফাইলগুলির বিরুদ্ধে শক্তিশালী নয়। যেমন ব্যবহার করার চেষ্টা করুন locateঅথবা makeতাদের উপর।
পুনরায় পোস্টার

8

এটি করার জন্য আপনি কেবল BASH কমান্ড ব্যবহার করতে পারেন (কোনও বাহ্যিক সরঞ্জাম ছাড়াই)।

for file in *; do echo "${file%.*}"; done 

এটি কার্যকরভাবে যখন আপনি / usr / বিন ছাড়া থাকেন এবং ফাইল.নমস.আইস.মেজ.পিএনজি এবং সমস্ত এক্সটেনশনের জন্য দুর্দান্ত কাজ করেন।


6

এটি পার্স করা lsবা পাইপ করা নিরাপদ নয় find[ 1 , 2 ]

lsবা এর আউটপুট পার্স করা (এবং পাইপ করা) নিরাপদ নয় find, মূলত কারণ ফাইলের নামগুলিতে নিউলাইন , ট্যাব হিসাবে সাধারণ অক্ষরগুলি খুঁজে পাওয়া সম্ভব ... এখানে একটি খাঁটি শেল চক্র কাজ করবে [ কিউংএলএম ]
এমনকি বিকল্পটি দিয়ে পাইপ না করাfind কমান্ডটিও কাজ করবে:-exec

find ./*.png  -exec  basename {} .png  \;

আপডেটস / নোটস : আপনি find .এমনকি লুকানো ফাইলগুলি অনুসন্ধান করতে বা find ./*.pngশুধুমাত্র গোপনীয় ফাইলগুলি পেতে ব্যবহার করতে পারেন । সঙ্গে find *.png -exec ...আপনি সমস্যা থাকতে পারে এটা নামের একটি ফাইল উপস্থিত ছিলেন .pngকারণ খুঁজে একটি বিকল্প যেমন পাবেন। আপনি -maxdepth 0যেমন ডিরেক্টরিতে নাম অন্তর্ভুক্ত করা এড়ানোর জন্য যোগ করতে পারেন Dir_01.png, বা find ./*.png -prune -exec ...যখন ম্যাক্সডেপথের অনুমতি নেই (ধন্যবাদ স্টাফেন)। আপনি যদি সেই ডিরেক্টরিগুলি তালিকাবদ্ধ করতে এড়াতে চান তবে আপনার বিকল্পটি যুক্ত করা উচিত -type f(এটি অন্যান্য ধরণের নিয়মিত ফাইলগুলিও বাদ দেয়)। manউপলভ্য সমস্ত বিকল্প সম্পর্কে আরও সম্পূর্ণ প্যানোরামা দেখার জন্য এটি দেখুন এবং আরও ভাল বহনযোগ্যতার জন্য তারা কখন পসিক্স অনুগত হয় তা পরীক্ষা করে দেখুন।

আরও কিছু শব্দ

এটি ঘটতে পারে, উদাহরণস্বরূপ, কোনও দস্তাবেজ থেকে শিরোনাম অনুলিপি করা এবং ফাইলনামে আটকানো, এক বা একাধিক নতুন লাইন ফাইলের নামেই শেষ হবে। আমরা এমনকি এত দুর্ভাগ্যজনক হতে পারি যে কোনও শিরোনামে এমনকি একটি নতুন লাইনের ঠিক আগে ব্যবহার করতে হবে এমন কীটিও থাকতে পারে:

The new art of working on .png
files and other formats.

আপনি যদি পরীক্ষা করতে চান তবে আপনি কমান্ডগুলি দিয়ে ফাইলের নাম তৈরি করতে পারেন

touch "A file with two lines"$'\n'"and This is the second.png"
touch "The new art of working on .png"$'\n'"files and other formats.png"

মুদ্রণযোগ্য অক্ষরের পরিবর্তে সরল /bin/ls *pngউইল আউটপুট?

A file with two lines?and This is the second.png
The new art of working on .png?files and other formats.png

সব ক্ষেত্রেই যা আপনি হবে মধ্যে নল আউটপুট এর lsবা findনিম্নলিখিত কমান্ড বুঝতে যদি বর্তমান লাইন একটি নতুন থেকে আসে কোন ইঙ্গিত থাকবে ফাইলের নাম বা যদি এটি একটি অনুসরণ সম্পর্কে newline নজির চরিত্রের ফাইলের নাম । একটি বাজে নাম প্রকৃতপক্ষে, কিন্তু এখনও একটি আইনী নাম।

একটি শেল প্যারামিটার-সম্প্রসারণ সঙ্গে একটি শেল চক্রের ${parameter%word}সঙ্গে উভয় বৈকল্পিক মধ্যে printfবা echoকাজ করবে [ cuonglm ], [ Anthon1 ]

for f in *.png; do printf "%s\n" "${f%.png}" ; done

শেল প্যারামিটার সম্প্রসারণের ম্যান পৃষ্ঠা থেকে [ 3 ]

me {প্যারামিটার% শব্দ}
$ {প্যারামিটার %% শব্দ}

... সম্প্রসারণের ফলাফলটি হ'ল সংক্ষিপ্ত মিলের প্যাটার্ন ('%' কেস) বা দীর্ঘতম মিলনের প্যাটার্ন ('%%' কেস) মুছে ফেলা পরামিতির মান।


এছাড়াও আপনার findআদেশের ফলাফলগুলি কিছুটা পরিবর্তনশীল (উদাহরণস্বরূপ যদি কোনও ডিরেক্টরি বলা হয় files.png)

1
প্রিয় @ ব্রোসলো, যখন আমি উপরে উত্তরটি লিখেছিলাম তখন আমি সেই মুহুর্তে উপস্থিত অন্যান্য রূপগুলির 13 (সমস্ত) চেষ্টা করেছিলাম , কমান্ড লাইনে, একটি স্ক্রিপ্টে, শেল আহ্বানের আর্গুমেন্ট হিসাবে চালু করেছি। দয়া করে একই করুন এবং আপনার প্রত্যাশা মতো তারা আচরণ করে কিনা তা আমাকে বলুন। আমি আমার পরীক্ষাগুলি bash 4.3.11, 0.5.7-4 ড্যাশ, জেডএস (যখন প্রয়োজন হবে) 5.0.2 দিয়েছিলাম। এই পোস্টটি পড়তে দ্বিধা বোধ করুন যা আরও কিছু যুক্ত করে। আমি আউটপুট পাইপ দেওয়ার নোট সম্পর্কে সম্মত find, এর জন্য আমি স্পষ্টভাবে পরামর্শ-exec দিয়েছি, এবং আমি শিরোনামে লিখেছি। :-)
হাস্তুর

উইকি আবার পড়ুন। আমি এখনও মনে করি আপনার উদাহরণটি পাইপ করা দরকার, যেহেতু এখানেই এটি আলোচনা করা হচ্ছে। এবং বেশিরভাগ আধুনিক সংস্করণের জন্য lsআউটপুটটি পাইপ করা বা পুনঃনির্দেশিত করার সময় কোনও সমস্যা নেই, তবে উইকিতে উল্লিখিত হিসাবে এটি সবার জন্য কার্যকর নাও হতে পারে। ?যখন আউটপুট টার্মিনালে প্রেরণ করা হয় তখন বেশিরভাগগুলি কেবলমাত্র বিশেষ অক্ষরের জায়গায় সন্নিবেশ করান । অর্থাৎ কর echo *.png | od -cএবং ls *.png | od -c। নিউলাইন ইস্যুটি কোনও সমস্যা নয় ls, এটি কোনও কমান্ডের সাথে ইস্যু যা পাইপের উভয় দিক জুড়েই শেষ করে না।

1
printf "${f%.png}\n"ভূল. প্রথম যুক্তিটি হ'ল ফর্ম্যাট, আপনার সেখানে ভেরিয়েবল ডেটা ব্যবহার করা উচিত নয়। এমনকি ডস দুর্বলতা হিসাবেও দেখতে পারা যায় ( %1000000000s.pngউদাহরণস্বরূপ কোনও ফাইল দিয়ে চেষ্টা করুন )।
স্টাফেন চেজেলাস 19:25

আপনার প্রয়োজন হবে find ./*.png -prune -exec...বা ফাইল নামগুলির সাথে প্রারম্ভিক সমস্যা থাকতে হবে -(এবং টাইপ ডিরেক্টরিগুলির ফাইলগুলি উল্লেখ করুন যেটি -maxdepthপোর্টেবল নয়)
স্টাফেন চ্যাজেলাস

4

যথেষ্ট ছিল না?

ls -1 | sed 's/\.png//g'

বা সাধারণভাবে, এই

ls -1 | sed 's/\.[a-z]*//g'

সমস্ত এক্সটেনশন সরিয়ে ফেলবে


এটি ছিল তবে অন্যান্য সমাধানগুলিও কাজ করে।
কলিন

আমি বলতে চাইছিলাম, আপনার প্রশ্নটি ls -1 দিয়ে শুরু হয়েছিল, তাই ls -1 করা উচিত। :)
রোহেল আব্বাস

-1ডিফল্ট এখানে হচ্ছে প্রয়োজন হয় না।
jlliagre

@ রোহেল আব্বাস তবে কি প্রতিটি সিস্টেম সেড ইনস্টল করে না?
কলিন

1
প্রকৃতপক্ষে, তবে lsএটি কোনও বিকল্প ছাড়াই করে না যখন এর আউটপুটটি টার্মিনাল হয় না, যা এখানে ক্ষেত্রে here
jlliagre

3

ব্যবহার rev:

ls -1 | rev | cut -f 2- -d "." | rev

revসমস্ত স্ট্রিং (লাইন) বিপরীত; আপনি প্রথম 'পরে সবকিছু কাটা।' এবং রেভ অবশিষ্টাংশকে বিপরীত করে।

আপনি যদি grep'আলমা' করতে চান :

ls -1 | rev | cut -f 2- -d "." | rev | grep 'alma'

-1ডিফল্ট এখানে হচ্ছে প্রয়োজন হয় না।
jlliagre

2
এটি নামের ফাইলটিতে খারাপভাবে ব্যর্থ হয়My.2016.Summer.Vacation.png
ডেভিড কনরাড

@ ডেভিডকনরড আমার খারাপ: / আমি সংশোধন করেছিcut -f 2-
টম সলিড

এখন এটি সেই ফাইলটির সাথে কাজ করে তবে একটি ফাইল .pngএবং ঠিক পরের সাথে একটি নতুন লাইন নিয়ে নয় ... এটি পার্স করা এড়ানো পরামর্শ দেওয়া হয়েছে lsকারণ এটি
আশ্চর্যগুলি

2

যদি আমি জানতাম ডিরেক্টরিতে কেবল এক্সটেনশন হিসাবে .png ফাইল থাকে তবে আমি কেবল চালিত হত: ls | awk -F. '{print $1}'

ফাইল-নাম. এক্সটেনশন রয়েছে এমন কোনও কিছুর জন্য এটি প্রথম "ক্ষেত্র" ফিরিয়ে দেবে।

উদাহরণ:

[rsingh@rule51 TESTDIR]$ ls
10.png  1.png  2.png  3.png  4.png  5.png  6.png  7.png  8.png  9.png

[rsingh@rule51 TESTDIR]$ ls | awk -F. '{print $1}'
10
1
2
3
4
5
6
7
8
9

দুর্ভাগ্যক্রমে এটি সমস্ত ফাইলের নামের একাধিক ., Image.1.pngএবং এমনকি ভাল নাম নয় এমন ভিতরে, বিশেষ অক্ষরের সাথে ব্যর্থ হবে । সম্পর্কে newline অথবা এক যে আপনি (ইনপুট) রেকর্ড বিভাজক হিসেবে ব্যবহার করবে যেমন awk, RS। এটি lsআউটপুট বিশ্লেষণ এড়ানোর পরামর্শ দেওয়া হয়েছে কারণ এটি এমন সমস্যা লুকিয়ে রাখতে পছন্দ করে যা যখন আপনি প্রত্যাশা করবেন না। এই রেফারেন্স 1 বা 2 তে আপনি আরও পড়তে পারেন । বিটিডাব্লু অ্যাজেড ব্যবহার করার মত ধারণাটি সুন্দর ... আমি একটি উত্তরে কয়েকটি উদাহরণ রেখেছি।
হাস্তুর

সত্য, তবে কলিনের দেওয়া নমুনা দেওয়া ঠিক কাজ করবে work আপনার প্রস্তাবিত মামলার জন্য এটি কাজ করার জন্য, আমি সম্ভবত এটিতে পরিবর্তন করব: [আরএসসিএইচ @ नियम51 টেস্টডিআর] s ls | sed -e 's / .png $ //' 10 1 2 3 4 5 6 7 8 9 harry.the.bunny whats.a.png.filename কঠিন হওয়ার চেষ্টা করছে না, তবে কলিনের প্রয়োজনীয়তা দেওয়া হয়েছে, আমি নিশ্চিত নই ইস্যুটি কীভাবে পার্সিং হবে?
আরসিংহ

দুঃখিত ... আমি ঠিক বুঝতে পেরেছিলাম যে 'ls' এর ফলাফল আউটপুট সংশোধন করার আগে আমি ফাইলগুলি দিয়ে ডিরেক্টরিটি প্রদর্শন করি নি [rsingh @ule51 TESTDIR] s ls 10.png 2.png 4.png 6.png 8.png harry.the.bunny.png 1.png 3.png 5.png 7.png 9.png whats.a.png.filename.png [rsingh @ नियम51 টেস্টির] $ এলএস | সেড-এর / .পিএনজি $ // '10 1 2 3 4 5 6 7 8 9 হ্যারি.থ.বানি কি.এ.পি.এন.পি.এন.পি. ফাইল
রিনিং

note1 আপনি অব্যাহতি প্রয়োজন .মধ্যে \.ভিতরে sed -e 's/\.png$//', কিন্তু তাই এটি হয়ে উত্তর শুধু লিখিত। :-( দ্রষ্টব্য 2 আপনি এর awkমতো কিছু দিয়ে ব্যবহার করার চেষ্টা করতে পারেন ls | awk -F. '{if ($NF=="png") {for (i=1;i<NF-1;i++) printf("%s.", $i) ; printf $(NF-1)"\n"}}'... তবে আপনার সর্বদা সমস্যা হবে যে ডাবলুটি ফাইলের নামের মধ্যে একটি নতুন লাইন অনুসরণ করছে বা না তা অবধি জানতে পারবেন না I আমি আমার উত্তরে আরও বলার চেষ্টা করেছি ।
হাস্তুর

ধন্যবাদ হাস্তুর, আমি মিস করেছি :)। এছাড়াও, আমি এক্ষেত্রে এসডের পক্ষে অ্যাডক ব্যবহারের বিষয়টি এড়িয়ে গেছি।
আরএসিংহ

2

আপনার মন্তব্য অনুসারে "আমার কাছে একটি টেক্সট ফাইল রয়েছে যেখানে এক্সটেনশন ছাড়াই সমস্ত নাম তালিকাভুক্ত করা হয়েছে I আমি কোনও পিএইচপি স্ক্রিপ্ট তৈরি করতে চাই যা কোনও ফাইল অনুপস্থিত তা দেখতে ফোল্ডারের সাথে পাঠ্য ফাইলটির তুলনা করে":

for file in $(cat yourlist) ; do
  [ -f "${file}.png" ] || {
    echo "$file : listed in yourlist, but missing in the directory"
  }
done
#assumes that filenames have no space...
# otherwise use instead:
#  while IFS= read file ; do ...(same inner loop as above)... ; done < yourlist

এবং বিপরীত:

for file in *.png ; do
  grep "^${file%.png}$" yourlist >/dev/null || {
    echo "$file: present in the directory but not listed in yourlist"
  }
done
#I assume there are no spaces/tabs/? before/after names in 'yourlist'. Change the script accordingly if there are some (or sanitize the list)

1

ls -l | sed 's/\.png$//'

@Roaima দ্বারা হাইলাইট করা হিসাবে সবচেয়ে সঠিক পদ্ধতি। পলান ছাড়া \.pngনামে ফাইল a_png.pngহিসেবে তালিকাভুক্ত করা হবে: a_


ls -lআপনি যেমনটি ব্যবহার করেন , ফাইলের বিবরণ দেন, ওপি সম্পর্কে এটিই জিজ্ঞাসা করে না।
অ্যান্থন

1

একটি সাধারণ শেল লাইন (কেশ, বাশ বা জেডএস; ড্যাশ নয়):

set -- *.png; printf '%s\n' "${@%.png}"

একটি সাধারণ ফাংশন (কোনও এক্সটেনশন থেকে):

ne(){ set -- *.png; printf '%s\n' "${@%.png}"; }

বা প্রদত্ত কোনও এক্সটেনশন সরিয়ে ফাংশন (ডিফল্টরূপে পিএনজি):

ne(){ ext=${1:-png}; set -- *."$ext"; printf '%s\n' "${@%.${ext}}"; }

ব্যবহৃত হচ্ছে:

ne jpg

যদি আউটপুটটি একটি তারকাচিহ্ন হয় *, তবে সেই এক্সটেনশন সহ কোনও ফাইল উপস্থিত নেই।


1

আপনি নিম্নোক্ত ফিডটি অজানাতে চেষ্টা করতে পারেন ls এর আউটপুটটি আপনার সরবরাহকারী "" "। এবং যেহেতু আপনার সমস্ত ফাইলের নাম থাকবে p png আপনি প্রথম কলামটি মুদ্রণ করবেন:
ls | awk -F"." '{print $1}'


-1

আপনার যদি শেডে প্রবেশ করার সুযোগ থাকে তবে এটি আরও ভাল কারণ এটি শেষ ফাইল এক্সটেনশনটি কেটে ফেলবে, তা যাই হোক না কেন (পিএনজি, জেপিজি, টিফ, ইত্যাদি ...)

ls | sed -e 's/\..*$//'

7
ফাইলনামের মতো বিরতি this.is.a.dotty.txts/\.[^.]*$//পরিবর্তে চেষ্টা করুন।
রোয়াইমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.