আমি কীভাবে লিনাক্সে তাদের নিখুঁত পথ দিয়ে ফাইলগুলির একটি তালিকা তৈরি করতে পারি?


304

আমি একটি শেল স্ক্রিপ্ট লিখছি যা ইনপুট হিসাবে ফাইলের পথ নেয়।

এই কারণে, আমার পুরো পাথ সহ পুনরাবৃত্ত ফাইল তালিকা তৈরি করতে হবে। উদাহরণস্বরূপ, ফাইলটির barপথ রয়েছে:

/home/ken/foo/bar

কিন্তু, যতটা আমি দেখতে পারেন, উভয় lsএবং findশুধুমাত্র আপেক্ষিক পাথ তালিকা করা উচিত:

./foo/bar   (from the folder ken)

এটি একটি সুস্পষ্ট প্রয়োজনের মতো বলে মনে হচ্ছে তবে আমি findবা lsম্যান পৃষ্ঠাগুলিতে কোনও কিছুই দেখতে পাচ্ছি না ।

আমি কীভাবে শেলগুলিতে তাদের নিখুঁত পথগুলি সহ ফাইলগুলির একটি তালিকা তৈরি করতে পারি?


ব্যবহার:find /home/ken/foo/bar -exec ls -ld $PWD/{} \;
শিক্ষার্থী

উত্তর:


305

আপনি যদি findশুরু করার জন্য কোনও পরম পাথ দেন তবে তা পরম পাথগুলি মুদ্রণ করবে। উদাহরণস্বরূপ, বর্তমান ডিরেক্টরিতে সমস্ত .htaccess ফাইল খুঁজে পেতে:

find "$(pwd)" -name .htaccess

অথবা যদি আপনার শেলটি $PWDবর্তমান ডিরেক্টরিতে প্রসারিত হয়:

find "$PWD" -name .htaccess

find এটি সেই পথ থেকে ফাইলের জন্য কোনও আপেক্ষিক পাথকে দেওয়া পথটিকে কেবল নতুনভাবে সংশোধন করে।

গ্রেগ হিউগিলpwd -P আপনার বর্তমান ডিরেক্টরিতে সিমলিংকগুলি সমাধান করতে চাইলে ব্যবহার করার পরামর্শও দিয়েছিলেন ।


9
মনে রাখবেন যে আপনি যদি সিমলিঙ্কগুলিও সমাধান করতে চান তবে ব্যবহার করুন pwd -P
গ্রেগ হিউগিল

5
এটি সহায়ক, তবে আমি মনে করি নীচে ব্যবহারকারীর 431529 এর প্রতিক্রিয়া আরও বৈধ: ls -d -1 $PWD/**/*তবে আমি অনুমান করি find $PWDএটিও কাজ করে ( ব্যাশে পরীক্ষিত)
ব্রায়ান

9
@ ব্রায়ান কেন? find $PWDসহজ. lsজাদুমন্ত্রোচ্চারণ (যদি না আপনি এটা ওরফে) জটিল এবং জবরজং হয়। findশেল গ্লোব বিস্তারের উপর নির্ভরশীল নয়, সুতরাং যে কোনও শেলটিতে কাজ করবে। findএছাড়াও অনেক বেশি নমনীয়, আমি সমস্ত ফাইলগুলির একটি পুনরাবৃত্ত তালিকা পেতে পারি বা সম্ভবত সমস্ত ডিরেক্টরিগুলির, বা সম্ভবত আমি সমস্ত এক্সএমএল ফাইলের তালিকা চাই, বা সমস্ত ফাইল গত সপ্তাহে পরিবর্তিত হয়েছিল। যা কিছু সম্ভব তা দিয়ে find, তবে সহজেই তা সম্ভব হয় না ls
ম্যাথু শার্লে

12
find "`pwd`" -name .htaccessডিরেক্টরি নামগুলির ফাঁকির কারণে আমাকে ব্যবহার করতে হয়েছিল
পাওলো ক্যাসারেটো

আমি এটি পাই না, এই আদেশটি আমাকে ফাইলের সম্পূর্ণ পথ দেয় না, অন্য তালিকাগুলিতে উত্তরগুলি কাজ করে does
বুর্জন ​​ওটো ভাসবোটেন

202
readlink -f filename 

সম্পূর্ণ পরম পথ দেয়। তবে ফাইলটি যদি একটি সিমিলিংক হয় তবে আপনি চূড়ান্ত সমাধানের নামটি পাবেন।


8
খুশী হলাম। রিডলিংকের বিএসডি ভেরিয়েন্টে (যেমন ম্যাক) কাজ করে না I আমি ম্যাকের উপর gnucoreutils ব্যবহার করি। এবং তাই গ্রিডলিঙ্ক ব্যবহার করতে পারেন যা উপরের সমাধানটির সাথে কাজ করে।
শেকি

12
ম্যাক ওএস এক্সে যাবেন না
অ্যান্ড্রু লাজারাস

1
@AndrewLazarus - ম্যাক OS X এর জন্য ব্যবহার realpathপরিবর্তে
CZ

যদি আপনি মাধ্যমে ব্যাশ সরঞ্জাম ইনস্টল brew install coreutils, তারপর এক্সিকিউটেবল হিসাবে ইনস্টল করা হবে/usr/local/opt/coreutils/libexec/gnubin/readlink
স্মৃতিভারাতুর

121

এটি ডিয়ারদের জন্য ব্যবহার করুন (এটি /পরে **ডিরেক্টরিগুলিতে সীমাবদ্ধ করতে ব্যাশের প্রয়োজন পরে ):

ls -d -1 "$PWD/"**/

এটি সরাসরি বর্তমান ডিরেক্টরিতে ফাইল এবং ডিরেক্টরিগুলির জন্য, যার নামগুলিতে একটি রয়েছে .:

ls -d -1 "$PWD/"*.*

এটি সব কিছুর জন্য:

ls -d -1 "$PWD/"**/*

এখান থেকে নেওয়া হয়েছে http://www.zsh.org/mla/users/2002/msg00033.html

ব্যাশে, **আপনি সক্ষম করলে পুনরাবৃত্ত হয় shopt -s globstar


1
ls -d -1 $ PWD / ** / * পুনরাবৃত্তি হয় না। আশা করি আমি আমার +1 ফিরে নিতে পারতাম। যদিও আপনাকে যেতে হবে প্রতিটি গভীরতার জন্য আপনি ** করতে পারেন।
ব্যবহারকারী 606723

4
** অপারেটর একটি পুনরাবৃত্ত গ্লোববিং অপারেটর। যদি আপনি শেলটিতে কমান্ডটি সমর্থন করেন যা এটি সমর্থন করে (যেমন zsh), এটি সঠিকভাবে কাজ করবে।
জাবেদিয়া 49

ls -d1 "$ PWD / "D*,.*। লুকানো (বিন্দু) ফাইলগুলিও ধরতে। আমার জন্য উত্তরের পুনরাবৃত্তিমূলক সংস্করণ সাবফোল্ডারগুলিতে ফাইলগুলির নিখুঁত পথটি আগে থেকেই তৈরি করে নি।
জায়েল

আমি মনে করি আমাকে সন্ধান করতে হবে ... আমি পেয়েছি -> বাশ: / বিন /
এলএস

30

তুমি ব্যবহার করতে পার

find $PWD 

ব্যাশে


3
এটি বর্তমান ডিরেক্টরি এবং তার নীচে সমস্ত ফাইল এবং ডিরেক্টরিগুলির পথ দেবে। এটি সম্ভবত লোকেরা যা খুঁজছেন তা নয়।
বিল

18
ls -d "$PWD/"*

এটি কেবল বর্তমান ডিরেক্টরিতে দেখায় । এটিতে "$ পিডাব্লুডি" উদ্ধৃত করে যদি এতে স্পেস থাকে।


এটি এখনও একটি খুব বৈধ উত্তর, তবে এটি পুনরাবৃত্তভাবে কাজ করে না এমন তথ্য অন্তর্ভুক্ত করা ভাল হবে (যা আমি বাস্তবে সন্ধান
করছিলাম

1
পুনরাবৃত্তির ব্যবহারের জন্য: সন্ধান করুন। -exec ls -ld $ PWD / {} \;
শিক্ষার্থী

10

COMMAND: ls -1 -d "$PWD/"*

এটি নীচের মত ফাইলের পরম পাথ দেয়।

[root@kubenode1 ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt

8

$PWDউপরে ম্যাথু দ্বারা একটি ভাল বিকল্প। আপনি যদি কেবল ফাইল মুদ্রণের জন্য সন্ধান করতে চান তবে আপনি কেবলমাত্র সাধারণ ফাইল অনুসন্ধান করতে-টাইপ চ বিকল্পটি যুক্ত করতে পারেন। অন্যান্য ডিরেক্টরিগুলি কেবল ডিরেক্টরি ইত্যাদির জন্য "ডি" হয় তাই আপনার ক্ষেত্রে এটি হবে (যদি আমি কেবলমাত্র .c এক্সট্রোল্টের জন্য ফাইলগুলি অনুসন্ধান করতে চাই):

find $PWD -type f -name "*.c" 

বা আপনি যদি সমস্ত ফাইল চান:

find $PWD -type f

দ্রষ্টব্য: আপনি উপরের কমান্ডটির জন্য একটি উপকরণ তৈরি করতে পারবেন না, কারণ the PWD আপনার বাসা ডিরেক্টরিতে স্বয়ংক্রিয়ভাবে সমাপ্ত হয় যখন বাশ দ্বারা সেট করা থাকে।


আসলে, -d মানে কেবল ডিরেক্টরি নয় - এর অর্থ এটি ফাইলের মতো ডিরেক্টরিগুলিও ব্যবহার করে। সুতরাং আপনি যদি LS -d / home হন তবে আপনি "/ হোম" ফিরে পাবেন, / ঘরে কী আছে তার তালিকা নয়।
ট্র্যাভিস

@ ট্রাভিস: তিনি অনুসন্ধানের বিকল্পের কথা বলছিলেন, এলএস নয়। তাঁর ক্ষেত্রে "Find / -type d" কেবলমাত্র ডিরেক্টরি খুঁজে পাবেন - যেমনটি তিনি বলেছিলেন।
অলিগোফ্রেন

6

আপনি যদি ফাইন্ড কমান্ডকে একটি নিখুঁত পথ দেন তবে এটি পরম পথ দিয়ে ফলাফলগুলিকে ছড়িয়ে দেবে। সুতরাং, কেন ডিরেক্টরি থেকে যদি আপনি টাইপ করেন:

find /home/ken/foo/ -name bar -print    

(আপেক্ষিক পাথের পরিবর্তে find . -name bar -print)

আপনি পাওয়া উচিত:

/home/ken/foo/bar

অতএব, যদি আপনি এটি চান ls -lএবং এটির পরম পথটি ফিরে পান, আপনি ls -lযা সন্ধান করেন তা আবিষ্কার করতে কমান্ডটি কেবল বলতে পারেন ।

find /home/ken/foo -name bar -exec ls -l {} ;\ 

দ্রষ্টব্য: {}এবং এর মধ্যে একটি স্থান রয়েছে;

আপনি এই জাতীয় কিছু পাবেন:

-rw-r--r--   1 ken admin       181 Jan 27 15:49 /home/ken/foo/bar

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

find / -name bar -exec ls -l {} ;\ 2> /dev/null

( 2>বোর্ন এবং বাশ শেলগুলির সিনট্যাক্স, তবে সি শেলটি দিয়ে কাজ করবে না It এটি অন্যান্য শেলগুলিতেও কাজ করতে পারে তবে আমি কেবল নিশ্চিতভাবে জানি যে এটি বোর্ন এবং বাশে কাজ করে)।


আপনি একই lsপ্রক্রিয়াতে একাধিক আরগ পাস করতে পারেন -exec ls -ld {} +। (আপনি সম্ভবত ডিরেক্টরি ডিরেক্টরি বিষয়বস্তু -dনা থাকতে চান ls)। বা ভাল, ব্যবহার খুঁজুন বিল্ট-এর lsসঙ্গে find ... name bar -ls। এছাড়াও, প্রতি কমান্ডের জন্য একটি আর্গের জন্য আপনার সিনট্যাক্সটি ভুল রয়েছে: আপনাকে শেল থেকে অর্ধিকলন উদ্ধৃত করতে হবে, তাই এটি {} \;
পিটার

5

fd

ব্যবহার fd(বিকল্প find), নিম্নলিখিত সিনট্যাক্স ব্যবহার করুন:

fd . foo -a

.অনুসন্ধানের ধরণটি কোথায় এবং fooমূল ডিরেক্টরি।

যেমন সব ফাইল তালিকা etcযাও recursively, চালানোর সময়: fd . /etc -a

-a, --absolute-path আপেক্ষিক পাথের পরিবর্তে পরম দেখান


2

এর বিকল্প মাত্র

ls -d "$PWD/"* 

*শেল সম্প্রসারণ যে পয়েন্টপয়েন্ট , তাই

echo "$PWD/"*

একই কাজ করবে (ফাঁকাটি আপনি -1নতুন লাইনের দ্বারা পৃথক করতে পারবেন না , ফাঁক দিয়ে নয়)


আপনি এই আরও বিস্তারিত বলতে পারেন? খোল সম্প্রসারণ কি? -1লাইন দ্বারা separete ব্যবহার কিভাবে ?
আন্তোনিও আরাউজো

অ্যান্টোনিও আরাউজো, শেল প্রসারণ শেল (যেমন বাশ) ফাইলের তালিকা সহ * প্রতিস্থাপন করবে - ব্যাশ ম্যান পৃষ্ঠায় আরও পড়তে পারে। -1 হ'ল ls কমান্ড বিকল্প, প্রতিধ্বনি অন্যান্য কমান্ড, এটির মতো বিকল্প নেই।
মারিশা


1

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

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"

1

এটি আমার পক্ষে কাজ করেছে। তবে এটি বর্ণানুক্রমিক ক্রমে তালিকাভুক্ত হয়নি।

find "$(pwd)" -maxdepth 1

এই কমান্ডটি বর্ণানুক্রমিকভাবে তালিকাবদ্ধ করার পাশাপাশি লুকানো ফাইলগুলিও তালিকাভুক্ত করে।

ls -d -1 "$PWD/".*; ls -d -1 "$PWD/"*;

1

stat

একক ফাইলের সম্পূর্ণ পথ:

stat -c %n "$PWD"/foo/bar

1

আপনি এটি চেষ্টা করতে পারেন।

for name in /home/ken/foo/bar/*
do
    echo $name
done

আপনি forলুপ ব্যবহার করে এবং echoসহজভাবে ছাড়া এবস পাথ পেতে পারেন find


0

আপনার যদি বর্তমান ফাইলগুলির পাশাপাশি উপ-ডিরেক্টরিগুলির তালিকা প্রয়োজন হয়

find $PWD -type f

আপনার যদি কেবল বর্তমান ডিরেক্টরিতে সমস্ত ফাইলের তালিকা প্রয়োজন হয়

find $PWD -maxdepth 1 -type f

0

এটি ক্যানোনিকাল পাথ দেবে (প্রতীকগুলি সমাধান করবে): realpath FILENAME

যদি আপনি নিজেরাই এই সিমলিংকের পক্ষে আধ্যাত্মিক পথ চান, তবে: realpath -s FILENAME


0

বেশিরভাগ ক্ষেত্রে যদি প্রস্তাবিত সমস্ত পদ্ধতির ফলাফল না ঘটে তবে সেই পথে যেগুলি অন্য কোনও টার্মিনাল কমান্ডে সরাসরি ব্যবহার করা যায় না যদি সেই পথে ফাঁক থাকে। আদর্শভাবে ফলাফলগুলিতে স্ল্যাশগুলি পুনরায় চাপানো হবে। এটি ম্যাকোজে আমার জন্য কাজ করে:

find / -iname "*SEARCH TERM spaces are okay*" -print 2>&1  | grep -v denied |grep -v permitted |sed -E 's/\ /\\ /g'

-1

find / -print এটি করবে


1
... দুর্ভাগ্যক্রমে এটি অন্য কিছু করবে (যেমন ফিল্টার না করা 'কিছু' অন্যান্য ফাইল প্রদর্শন করা)
ডারমাইক

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