উত্তর:
আদেশ :
ls -ld .?*
শুধুমাত্র লুকানো ফাইলগুলি তালিকাবদ্ধ করবে।
ব্যাখ্যা করা :
-l use a long listing format
-d, --directory
list directory entries instead of contents, and do not derefer‐
ence symbolic links
.?* will only state hidden files
.
এবং ..
ম্যাচটি থেকে বাদ দেওয়া । তবে এটি (পুরোপুরি আইনি) যেমন একক-অক্ষর লুকানো ফাইলের নামের অগ্রাহ্য করবে .a
, .1
ইত্যাদি। সম্ভবত আরও ভাল বর্ধিত গ্লোব হবে .!(|.)
অর্থাত্ আক্ষরিক বিন্দুতে কিছু না কিছু ছাড়া অন্য কিছু (একক) বিন্দু অর্থাতls -d .!(|.)
ls -d .!(|.)
ওপি ঠিক যা খুঁজছে তা করে।
!(pattern-list)
, pattern-list
এক বা একাধিক নিদর্শন একটি দ্বারা পৃথক একটি তালিকা রয়েছে |
, কিন্তু এটা আমার জন্য বিভ্রান্তিকর যে আপনি বাঁদিকে কোনো প্যাটার্ন নেই |
। আপনি আমাকে দয়া করে সিনট্যাক্স ব্যাখ্যা করতে পারেন?
.
(কিছুই বা না .
) অনুসরণ করার মতো নয় । .
..
আপনি যদি কেবলমাত্র আপনার বর্তমান ডিরেক্টরিতে ফাইলগুলি চান (কোনও পুনরাবৃত্তি হয় না), আপনি করতে পারেন
echo .[^.]*
এটি সেই সমস্ত ফাইলের নাম মুদ্রণ করবে যার নাম একটি দিয়ে শুরু হয় .
এবং তারপরে এক বা একাধিক নন অক্ষর রয়েছে। নোট করুন যে এটি এমন ফাইলে ব্যর্থ হবে যার নাম ক্রমাগত বিন্দু দিয়ে শুরু হয়, উদাহরণস্বরূপ ....foo
প্রদর্শিত হবে না।
আপনি এটি ব্যবহার করতে পারেন find
:
find -mindepth 1 -prune -name '.*'
আমাদের সাথে -mindepth
মেলে না এমন নিশ্চয়তা .
এবং এর -prune
অর্থ find
উপ-ডিরেক্টরিতে নেমে আসবে না।
ব্যবহার find
এবং awk
,
find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
ব্যাখ্যা:
find . -type f
-> বর্তমান ডিরেক্টরিতে সমস্ত ফাইলের সাথে এটির পথের তালিকা তৈরি করুন,
./foo.html
./bar.html
./.foo1
awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
/
ফিল্ড বিভাজক হিসাবে ডাবের সাথে স্টার করা শেষ ক্ষেত্রের জন্য খালি পরীক্ষা করা হয়। যদি এটি কোনও বিন্দু দিয়ে শুরু হয়, তবে এটি সেই সম্পর্কিত লাইনের শেষ ক্ষেত্রটি মুদ্রণ করে।
find -type f
। আপনার স্পষ্টতই অনুসন্ধানের পথটি সেট করার দরকার নেই বা -name "*"
।
find
নাম গ্লোব্বিং ব্যবহার করার চেয়ে জটিল অনুসন্ধানগুলির জন্য সাধারণত একটি ভাল বিকল্প।
find . -mindepth 1 -maxdepth 1 -name '.*'
অথবা
find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'
find .
বর্তমান ডিরেক্টরি অনুসন্ধান করে
-mindepth 1
বাদ দেয় এবং .. তালিকা থেকে
-maxdepth 1
বর্তমান ডিরেক্টরিতে অনুসন্ধান সীমাবদ্ধ করে
-name '.*'
বিন্দু দিয়ে শুরু হওয়া ফাইলের নামগুলি সন্ধান করুন
-o
অথবা
-name '*~'
টিলড দিয়ে শেষ হওয়া ফাইলের নামগুলি সন্ধান করুন (সাধারণত, এটি পাঠ্য সম্পাদনা প্রোগ্রামগুলির ব্যাকআপ ফাইলগুলি হয়)
যাইহোক, এটি এবং অন্যান্য উত্তরগুলির সমস্ত বর্তমান ফাইলগুলির ডিরেক্টরি ফাইল থেকে বাদ দেয় .hidden
। আপনি যদি কোনও স্ক্রিপ্ট লিখছেন, তবে এই লাইনগুলি .hidden
ফাইলটি পড়বে এবং বিদ্যমান ফাইলগুলির নাম প্রদর্শন করবে।
if [[ -f .hidden]] # if '.hidden' exists and is a file
then
while read filename # read file name from line
do
if [[ -e "$filename" ]] # if the read file name exists
then
echo "$filename" # print it
fi
done < .hidden # read from .hidden file
fi
.hidden
ফাইল? কেন এমন কোনও ফাইল থাকবেন যেখানে .hidden
এই ফাইলের নাম রয়েছে? যাইহোক, যদি এমন এক থাকে তবে আপনি কেন এমন জটিল কিছু করবেন যখন আপনার যা প্রয়োজন তা হবে cat .hidden
? আপনার find
আদেশটি সঠিক (ইশ) তবে এটি -name '*~'
অপ্রাসঙ্গিক। টিল্ডগুলির মধ্যে শেষ হওয়া ফাইলগুলি ব্যাকআপ ফাইল তবে কোনওভাবেই লুকানো থাকে না।
.hidden
ফাইলটি যখন আপনি কোনও ডট দিয়ে শুরু করতে ফাইল / ফোল্ডারের নাম পরিবর্তন করতে পারবেন না তখন আপনি যে ফাইলগুলি এবং ফোল্ডারগুলি আড়াল করতে চান তার জন্য ফাইল। টিল্ডসে শেষ হওয়া ফাইলগুলির জন্য এটি সিস্টেমের উপর নির্ভর করে। ls -B
বেশিরভাগ জিইউআই ফাইল এক্সপ্লোরারদের মতো এ জাতীয় ফাইলগুলিও উপেক্ষা করা হবে।
cat .hidden
এই ফাইলগুলি মুছে ফেলা বা .hidden
ফাইলটিতে যুক্ত হওয়ার পরে সরানো থাকলে সেই ফাইলগুলি আর উপস্থিত থাকতে পারে ।
আমি মনে করি আপনি নিম্নলিখিত কমান্ড দিয়ে এটি করতে পারেন।
ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
ls -a
আপনি যে কমান্ডটি প্রবেশ করেছেন, সেগুলি বর্তমান চলমান ডিরেক্টরি ডিরেক্টরিতে সমস্ত ফাইল এবং ডিরেক্টরি দেখায়।
grep "^\."
কমান্ড আমি সংযুক্ত করেছি, যে কেবল আড়াল করা ফাইল দেখানোর জন্য আউটপুট ফিল্টার করে (এর নাম দিয়ে শুরু হয় "."
)।
grep -v "^\.$" | grep -v "^\..$"
কমান্ড আমি সংযুক্ত করেছি, যা আউটপুট ফিল্টার করে না।, .. (তারা বর্তমান এবং মূল ডিরেক্টরি)।
কিছু ফাইলনামের সাথে যদি এক লাইনের বেশি "\n"
থাকতে পারে তবে উপরের উদাহরণটি ভুল হতে পারে।
সুতরাং আমি এটি সমাধান করার জন্য নিম্নলিখিত কমান্ডের পরামর্শ দিচ্ছি।
find -maxdepth 1 -name ".[!.]*"
ls
উচিত নয় ।
আপনি আর কী করতে পারতেন, is ls .?*
বা ls .!(|)
এটি আপনাকে বর্তমান ডিয়ারের গোপন ফাইল / শীর্ষে শীর্ষে এবং নীচের অন্যান্য ফাইল / ডায়ারগুলিতে সমস্ত কিছু দেখায়
যেমন: আমার টার্মিনাল থেকে
$ ls .?*
.bash_history .dmrc .macromedia .weather
.bash_logout .gksu.lock .profile .wgetrc
.bash_profile .bashrc.save .ICEauthority .toprc .Xauthority
.bashrc .lastdir .viminfo .xsession-errors
.bashrc~ .dircolors .lynxrc .vimrc .xsession-errors.old
..:
Baron
.adobe:
Flash_Player
.aptitude:
cache config
.cache:
compizconfig-1 rhythmbox
dconf shotwell
এখন উপরের ফলাফলগুলিতে লক্ষ্য করুন, এটি আপনাকে প্রতিটি ফাইল / ডির এর সাবডির এবং নীচে নীচের যে কোনও লুকানো ফাইলের সাথে দেখায়।
[1:0:248][ebaron@37signals:pts/4][~/Desktop]
$ ls .!(|)
.bash_aliases .bashrc1 .bashrc1~
..:
askapache-bash-profile.txt examples.desktop Public top-1m.csv
backups Firefox_wallpaper.png PycharmProjects top-1m.csv.zip
Desktop java_error_in_PYCHARM_17581.log Shotwell Import Log.txt topsites.txt
Documents Music Templates Videos
Downloads Pictures texput.log vmware
দুঃখিত, আমি মন্তব্য করতে পারি না। মধ্যে এখানে পার্থক্য ব্যাখ্যা করতে ls .?*
এবং @ cioby23 উত্তর ls -d .[!.]* .??*
আর কেনই বা এটা আসলে লুকানো ফাইল মুদ্রণ দুইবার কারণ আক্ষরিক আপনি দুইবার বলছি হয় .??*
, .?*
, .[!.]*
তারা একই জিনিস, তাই বিভিন্ন কমান্ড অক্ষর তাদের কোন যোগ দুইবার প্রিন্ট করবে।
এখনও অবধি সমস্ত উত্তর এই ফাইলের (বা ডিরেক্টরিগুলি) নামের সাথে ডট দিয়ে শুরু হওয়া "গোপন" রয়েছে তার উপর ভিত্তি করে। আমি আরও একটি সমাধান নিয়ে এসেছি, এটি ততটা দক্ষ নাও হতে পারে, তবে এই সমাধানটি লুকানো ফাইলগুলির নাম সম্পর্কে কিছুই ধরে নেয় না এবং ..
ফলস্বরূপ তালিকাটি এড়িয়ে চলেছে (বর্তমানে গৃহীত উত্তর হিসাবে)।
সম্পূর্ণ কমান্ডটি হ'ল:
ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)
ব্যাখ্যা
এটি যা করে তা হ'ল সমস্ত ফাইল (এবং ডিরেক্টরিগুলি) দু'বার তালিকাবদ্ধ করা,
echo -e "$(\ls)\n$(\ls -A)"
তবে কেবল একবার লুকানো ফাইল দেখানো হচ্ছে -A
।
তারপরে তালিকাটি বাছাই করা হয়েছে | sort
যা নিয়মিত (অদৃশ্য) ফাইল দু'বার এবং একে অপরের পাশে প্রদর্শিত হয়।
তারপরে, | uniq -u
অনন্য লাইনগুলি রেখে একাধিকবার প্রদর্শিত সমস্ত লাইনগুলি সরিয়ে ফেলুন ।
সবশেষে ls
ব্যবহারকারীর কাস্টম বিকল্পগুলি এবং তালিকার ডিরেক্টরিগুলির বিষয়বস্তু তালিকাভুক্ত না করে সমস্ত ফাইল তালিকাবদ্ধ করতে আবার ব্যবহার করুন -d
।
সম্পাদনা (সীমাবদ্ধতা):
যেমন মুড়ু উল্লেখ করেছে, এই সমাধানটি সঠিকভাবে কাজ করবে না যদি নামের সাথে ফাইল থাকে escaped\ncharacter.txt
কারণ echo -e
ফাইলনামটি দুটি লাইনে বিভক্ত করা হয়। এটি হিসাবে প্রত্যাশিত যদি যেমন একটি বিশেষ অক্ষর, ব্যতীত প্রায় একই নামের দুটি লুকানো ফাইল কাজ করবে না .foo[tab].txt
এবং .foo[new-line].txt
হিসাবে যারা উভয় হিসাবে ছাপা হয় .foo?.txt
এবং দ্বারা নির্মূল করা হবেuniq -u
.
প্রথম চরিত্র হিসাবে কাজ করার ক্ষেত্রে একটি বাগ থেকে ।
..
তবে আমি আশ্চর্য হই যে এটি বিশেষ অক্ষরযুক্ত ফাইলের নামগুলির সাথে কতটা ভাল কাজ করে।
echo -e
ব্যাখ্যা করবে। এছাড়াও: ls
ফাইলের নামগুলিকে মঙ্গলে লাগবে না যাতে দুটি পৃথক ফাইলের নাম একই প্রদর্শিত হয় (উদাহরণস্বরূপ, কিছু সংস্করণে বিশেষ অক্ষরের জন্য ls
ব্যবহৃত হবে ?
, সুতরাং .foo\tbar
( \t
=> ট্যাব) এবং .foo\nbar
( \n
=> নিউলাইন) উভয়ই প্রদর্শিত হবে foo?bar
)।
বিকল্পভাবে, আপনি ব্যবহার করতে পারেন echo .*
যেমন
user@linux:~$ echo .*
. .. .bash_aliases .bash_history .bash_logout .bashrc
user@linux:~$
আপনি যদি এটি দীর্ঘ তালিকার ফর্ম্যাটে পছন্দ করেন তবে কেবল সাদা স্থানটিকে একটি নতুন লাইনে রূপান্তর করুন।
user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$
বাশ সহ, GLOBIGNORE
বিশেষ ভেরিয়েবল সেট করা কিছু অ শূন্য মান এটিকে উপেক্ষা করার জন্য .
এবং ..
গ্লোবগুলি প্রসারিত করার জন্য যথেষ্ট । থেকে ব্যাশ ডক্স :
GLOBIGNORE
শেল পরিবর্তনশীল নকশার সাথে মেলে এমন ফাইলের সেট সীমিত করতে ব্যবহৃত হতে পারে। যদিGLOBIGNORE
সেট করা থাকে তবে প্রতিটি মিলে যাওয়া ফাইলের নাম যা এর মধ্যে অন্যতম নিদর্শনGLOBIGNORE
মেলে তা ম্যাচের তালিকা থেকে সরানো হয়। যদিnocaseglob
বিকল্পটি সেট করা থাকে তবে নিদর্শনগুলির সাথেGLOBIGNORE
মিলটি কেস বিবেচনা ছাড়াই সম্পাদিত হবে। ফাইলের নামের.
এবং..
যখন সবসময় উপেক্ষা করা হয়GLOBIGNORE
সেট করা হয় এবং নাল না। যাইহোক,GLOBIGNORE
একটি নন-নাল মান সেট করার সাথে ডটগ্লোব শেল বিকল্পটি সক্রিয় করার প্রভাব রয়েছে, সুতরাং‘.
'এর সাথে শুরু হওয়া অন্য সমস্ত ফাইলের নাম মিলবে।
আমরা এটা সেট করেন তাহলে .:..
, উভয় .
এবং ..
উপেক্ষা করা হবে। যেহেতু অ-শূন্য কিছুতে এটি সেট করাও এই আচরণ পাবে, তাই আমরা সম্ভবত এটি ঠিক করে রেখেছি.
তাই:
GLOBIGNORE=.
ls -d .*
ls -ld .*
বাls -ald .*
কাজ করবে