টার্মিনালে কীভাবে কেবল লুকানো ফাইলগুলি দেখানো যায়?


154

আমার একটি ডিরেক্টরি রয়েছে যা হাজার হাজার ফাইল রয়েছে যার মধ্যে কয়েকটি লুকানো রয়েছে।

কমান্ডটি ls -aলুকানো ফাইলগুলি সহ সমস্ত ফাইল তালিকাভুক্ত করে তবে আমার কেবল লুকানো ফাইলগুলি তালিকাবদ্ধ করতে হবে।

আমার কোন আদেশ ব্যবহার করা উচিত?


1
একটি সাধারণ ls -ld .*বা ls -ald .*কাজ করবে
জন স্ট্রুড

উত্তর:


189

আদেশ :

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 

8
আপনার সেখানে দুটি প্রশ্ন চিহ্নের দরকার নেই, * * এটি কভার করে (? কেবল কোনও একক অক্ষরের সাথে মেলে, * তাদের কোনও সংখ্যার সাথে মেলে)।
psusi

13
@ স্পুসী, আমি মনে করি উদ্দেশ্যটি বাদ .এবং ..ম্যাচটি থেকে বাদ দেওয়া । তবে এটি (পুরোপুরি আইনি) যেমন একক-অক্ষর লুকানো ফাইলের নামের অগ্রাহ্য করবে .a, .1ইত্যাদি। সম্ভবত আরও ভাল বর্ধিত গ্লোব হবে .!(|.)অর্থাত্ আক্ষরিক বিন্দুতে কিছু না কিছু ছাড়া অন্য কিছু (একক) বিন্দু অর্থাতls -d .!(|.)
স্টিল্ড্রাইভার

@ স্টিল্ড্রাইভার, ঝরঝরে, ?? সংস্করণ "বাদ দেয়"। এবং "..". এটি মনে হয় আকর্ষণীয় কৌতূহলের ফলাফল: না? না * একটি বিন্দু মেলে, কিন্তু? কিছু মিলাতে হবে অন্যথায় নামটি উপেক্ষা করা হবে।
psusi

ডিরেক্টরিগুলি এবং ফাইলগুলি সনাক্ত করতে এফ বিকল্পটি যুক্ত করুন, অর্থাত্, ls -ldF।? * ডিরেক্টরিতে সর্বশেষ প্রদর্শিত অক্ষর ফাইল হিসাবে "/" নাম রয়েছে have
আরসিএফ

1
এটি প্রায় .vim এর মতো লুকানো ফোল্ডার ছাড়াও এটি প্রায় কাজ করে যা আমি এখানে কোনও ফাইল হিসাবে বিবেচনা করি না। আমি এটিকে কিছুটা ls -ldp এর মতো পরিবর্তন করেছি?? * | গ্রেপ-ভি / এই কেবল লুকানো ফাইলের তালিকা লুকানো ফোল্ডার নয়
ফ্রেড ইয়াং

31
ls -d .!(|.)

ওপি ঠিক যা খুঁজছে তা করে।


1
ওটা কিভাবে কাজ করে?
সারকাস্টিকসুলি

একটি ডিরেক্টরি তালিকা। এবং একটি ছাড়া কিছু তালিকাভুক্ত করবেন না এটি এটির বেশিরভাগ অনুবাদ করে।
প্যাট্রিক

1
আমি বুঝতে পারছি যে !(pattern-list), pattern-listএক বা একাধিক নিদর্শন একটি দ্বারা পৃথক একটি তালিকা রয়েছে |, কিন্তু এটা আমার জন্য বিভ্রান্তিকর যে আপনি বাঁদিকে কোনো প্যাটার্ন নেই |। আপনি আমাকে দয়া করে সিনট্যাক্স ব্যাখ্যা করতে পারেন?
কার্লোস মেন্ডোজা

2
@ কার্লোস মেন্দোজা যে খালি প্যাটার্নে পরিণত হবে, তাই এটি নিজেকে বাদ দিয়ে .(কিছুই বা না .) অনুসরণ করার মতো নয় । ...
মুরু

16

আপনি যদি কেবলমাত্র আপনার বর্তমান ডিরেক্টরিতে ফাইলগুলি চান (কোনও পুনরাবৃত্তি হয় না), আপনি করতে পারেন

echo .[^.]*

এটি সেই সমস্ত ফাইলের নাম মুদ্রণ করবে যার নাম একটি দিয়ে শুরু হয় .এবং তারপরে এক বা একাধিক নন অক্ষর রয়েছে। নোট করুন যে এটি এমন ফাইলে ব্যর্থ হবে যার নাম ক্রমাগত বিন্দু দিয়ে শুরু হয়, উদাহরণস্বরূপ ....fooপ্রদর্শিত হবে না।

আপনি এটি ব্যবহার করতে পারেন find:

find -mindepth 1 -prune -name '.*'

আমাদের সাথে -mindepthমেলে না এমন নিশ্চয়তা .এবং এর -pruneঅর্থ findউপ-ডিরেক্টরিতে নেমে আসবে না।



4

ব্যবহার 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 "*"
টেরডন

3

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 '*~'অপ্রাসঙ্গিক। টিল্ডগুলির মধ্যে শেষ হওয়া ফাইলগুলি ব্যাকআপ ফাইল তবে কোনওভাবেই লুকানো থাকে না।
terdon

@terdon .hiddenফাইলটি যখন আপনি কোনও ডট দিয়ে শুরু করতে ফাইল / ফোল্ডারের নাম পরিবর্তন করতে পারবেন না তখন আপনি যে ফাইলগুলি এবং ফোল্ডারগুলি আড়াল করতে চান তার জন্য ফাইল। টিল্ডসে শেষ হওয়া ফাইলগুলির জন্য এটি সিস্টেমের উপর নির্ভর করে। ls -Bবেশিরভাগ জিইউআই ফাইল এক্সপ্লোরারদের মতো এ জাতীয় ফাইলগুলিও উপেক্ষা করা হবে।
মার্ক এইচ

cat .hiddenএই ফাইলগুলি মুছে ফেলা বা .hiddenফাইলটিতে যুক্ত হওয়ার পরে সরানো থাকলে সেই ফাইলগুলি আর উপস্থিত থাকতে পারে ।
মার্ক এইচ

এটি ভাল কাজ করে।
পেঙ্গে গেঞ্জ

2

আমি মনে করি আপনি নিম্নলিখিত কমান্ড দিয়ে এটি করতে পারেন।

ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"

ls -a আপনি যে কমান্ডটি প্রবেশ করেছেন, সেগুলি বর্তমান চলমান ডিরেক্টরি ডিরেক্টরিতে সমস্ত ফাইল এবং ডিরেক্টরি দেখায়।

grep "^\."কমান্ড আমি সংযুক্ত করেছি, যে কেবল আড়াল করা ফাইল দেখানোর জন্য আউটপুট ফিল্টার করে (এর নাম দিয়ে শুরু হয় ".")।

grep -v "^\.$" | grep -v "^\..$" কমান্ড আমি সংযুক্ত করেছি, যা আউটপুট ফিল্টার করে না।, .. (তারা বর্তমান এবং মূল ডিরেক্টরি)।

কিছু ফাইলনামের সাথে যদি এক লাইনের বেশি "\n"থাকতে পারে তবে উপরের উদাহরণটি ভুল হতে পারে।

সুতরাং আমি এটি সমাধান করার জন্য নিম্নলিখিত কমান্ডের পরামর্শ দিচ্ছি।

find -maxdepth 1 -name ".[!.]*"


@ রাদুআরেদানু আমি আপনার মন্তব্যটি দেখেছি, এটি খুব ভাল। আমি আমার উত্তরটি আবার সম্পাদনা করেছি। আপনার মন্তব্যে আপনাকে ধন্যবাদ।
xiaodongjie

2

আপনি আর কী করতে পারতেন, 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 .[!.]* .??*আর কেনই বা এটা আসলে লুকানো ফাইল মুদ্রণ দুইবার কারণ আক্ষরিক আপনি দুইবার বলছি হয় .??*, .?*, .[!.]*তারা একই জিনিস, তাই বিভিন্ন কমান্ড অক্ষর তাদের কোন যোগ দুইবার প্রিন্ট করবে।


1

আপনি এটি ব্যবহার করতে পারেন:

ls -d .[!.]* .??*

এটি আপনাকে সাধারণ লুকানো ফাইল এবং লুকানো ফাইলগুলি প্রদর্শন করতে অনুমতি দেয় যা উদাহরণস্বরূপ 2 বা 3 ডট দিয়ে শুরু হয়: ..hidden_file


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

1

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

ls -Ad .??*

ls -a | grep "^\."সমাধানগুলিতে গ্রেপ-ভিত্তিক পদ্ধতির বিপরীতে মাল্টি-কলামের তালিকা দেওয়ার অনুমতি দেওয়ার সুবিধা রয়েছে advantage


1

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

সম্পূর্ণ কমান্ডটি হ'ল:

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


1
আমি মনে করি এটি হাইড ফাইলগুলির সংজ্ঞা থেকে অনেক বেশি। এমনকি এই লুকানো ফাইলগুলির উত্স .প্রথম চরিত্র হিসাবে কাজ করার ক্ষেত্রে একটি বাগ থেকে ।
মুরু

আমি প্রথম অনুচ্ছেদে এটি (সত্য হিসাবে) উল্লেখ করেছি। এটি এখনও বর্তমান গৃহীত উত্তরের চেয়ে আলাদা ফলাফল পেয়েছে
আলেজান্দ্রো

অবশ্যই, এটি বাদ দেয় ..তবে আমি আশ্চর্য হই যে এটি বিশেষ অক্ষরযুক্ত ফাইলের নামগুলির সাথে কতটা ভাল কাজ করে।
মুরু

আমি বিশেষ অক্ষরগুলির দ্বারা আপনি কী বোঝাতে চেয়েছেন তা ঠিক জানি না তবে আমি মনে করি এটি কোনও সমস্যা হিসাবে দেখবে না, কারণ এই সমাধানটি ফাইলের নামগুলি নিয়ে কিছু ধরে নেয় না
আলেজান্দ্রো

আসলে, আপনি কমপক্ষে একটি জিনিস ধরে নিবেন: ফাইলের নামগুলিতে সেগুলিতে নতুন লাইন থাকে না। এছাড়াও: ফাইলের নামগুলিতে তাদের পালানোর ক্রম নেই যা echo -eব্যাখ্যা করবে। এছাড়াও: lsফাইলের নামগুলিকে মঙ্গলে লাগবে না যাতে দুটি পৃথক ফাইলের নাম একই প্রদর্শিত হয় (উদাহরণস্বরূপ, কিছু সংস্করণে বিশেষ অক্ষরের জন্য lsব্যবহৃত হবে ?, সুতরাং .foo\tbar( \t=> ট্যাব) এবং .foo\nbar( \n=> নিউলাইন) উভয়ই প্রদর্শিত হবে foo?bar)।
মুরু

1

বিকল্পভাবে, আপনি ব্যবহার করতে পারেন 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:~$ 

0

বাশ সহ, GLOBIGNOREবিশেষ ভেরিয়েবল সেট করা কিছু অ শূন্য মান এটিকে উপেক্ষা করার জন্য .এবং ..গ্লোবগুলি প্রসারিত করার জন্য যথেষ্ট । থেকে ব্যাশ ডক্স :

GLOBIGNOREশেল পরিবর্তনশীল নকশার সাথে মেলে এমন ফাইলের সেট সীমিত করতে ব্যবহৃত হতে পারে। যদি GLOBIGNOREসেট করা থাকে তবে প্রতিটি মিলে যাওয়া ফাইলের নাম যা এর মধ্যে অন্যতম নিদর্শন GLOBIGNOREমেলে তা ম্যাচের তালিকা থেকে সরানো হয়। যদি nocaseglobবিকল্পটি সেট করা থাকে তবে নিদর্শনগুলির সাথে GLOBIGNOREমিলটি কেস বিবেচনা ছাড়াই সম্পাদিত হবে। ফাইলের নামের .এবং ..যখন সবসময় উপেক্ষা করা হয় GLOBIGNOREসেট করা হয় এবং নাল না। যাইহোক, GLOBIGNOREএকটি নন-নাল মান সেট করার সাথে ডটগ্লোব শেল বিকল্পটি সক্রিয় করার প্রভাব রয়েছে, সুতরাং ‘.'এর সাথে শুরু হওয়া অন্য সমস্ত ফাইলের নাম মিলবে।

আমরা এটা সেট করেন তাহলে .:.., উভয় .এবং ..উপেক্ষা করা হবে। যেহেতু অ-শূন্য কিছুতে এটি সেট করাও এই আচরণ পাবে, তাই আমরা সম্ভবত এটি ঠিক করে রেখেছি.

তাই:

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