ফাইন্ড-এক্সেক এলএস এর আউটপুটটি বাছাই করুন


14

এটা কি আউটপুট সম্ভব? find … -exec ls -ls ;ফাইল নাম অনুসারে, বর্ণানুক্রমিকভাবে বাছাই ?

এটি আমার ক্রোন কমান্ড:

find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;

এই কমান্ডটি বেশিরভাগ অংশের জন্য ঠিক আছে। তবে ফলাফলগুলি কোনও অর্থবহ ক্রম অনুসারে বাছাই করা হয় না। এটি ফাইলের নাম ক্ষেত্র অনুসারে বাছাই করা হলে খুব সহায়ক হবে।


1
Zsh ব্যবহার করছেন? ls -ls **/*(.)
কেভিন

@ কেভিন যথেষ্ট নয় - lsবাছাই করবে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

উত্তর:


14

আমি ধরে নিলাম যে আপনার ফাইলের নামগুলিতে নতুন লাইন নেই।

find /home/setefgge/public_html -type f -ctime -1 -exec ls -nls {} + | sort -k 10

ব্যবহার +পরিবর্তে ;বিনষ্ট -execকর্ম এটি দ্রুত এর আমন্ত্রণ Batching দ্বারা তোলে ls। আপনি sortকমান্ডটি দিয়ে পাইপ করে বাছাই করতে পারেন ; এটি 10 ​​তম ক্ষেত্রে বাছাই শুরু করতে বলুন (প্রথম 9 হ'ল মেটাডেটা: ব্লক, অনুমতি, লিঙ্ক গণনা, ব্যবহারকারী, গোষ্ঠী, আকার এবং 3 তারিখ / সময় ক্ষেত্র)। বিকল্পটি ব্যবহারকারী এবং গোষ্ঠীর জন্য সংখ্যাসূচক মানগুলি ব্যবহার করতে -nবলে ls, যা ব্যবহারকারী বা গোষ্ঠী বিশিষ্ট স্থান যুক্ত ঝুঁকি এড়ায়।

বিকল্পভাবে, zsh এর সাহায্যে, আপনি ফাইল সংগ্রহ এবং বাছাই করতে গ্লোব কোয়ালিফায়ার ব্যবহার করে এবং কমান্ড লাইনটি দীর্ঘ হলে একাধিকবার zargsচালানোর জন্য কোনও নাম নিয়ে কোনও অনুমান ছাড়িয়েls যেতে পারেন। পুনরায় বাছাই এড়াতে আপনার জিএনইউ ls(বিশেষত এর -fবিকল্প) দরকার নেই ls(অন্য পদ্ধতিটি হবে lszsh এর সাথে অনুকরণ করা zstat)।

autoload -U zargs
zargs -- /home/setefgge/public_html/**/*(.c-2) -- ls -lnsf

তোমাকে অনেক ধন্যবাদ! আপনার প্রেরিত প্রথম কমান্ডটি ব্যবহার করে বাছাই করে। আমি যদি আরও একটি ছোট পথ ব্যবহার করি তবে সংখ্যাটি এখনও 10 হবে? উদাহরণস্বরূপ, আমি যদি সরকারী_ html এর পরিবর্তে / home / setefgge থেকে একই কমান্ডটি চালিত করি?
মেজে

@ মেজে 10 হ'ল বাদ দেওয়া ক্ষেত্রের সংখ্যা, এটি ফাইলের নামের আকারের সাথে কিছুই করার নেই।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

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

@ মাজেজকে সমাধান হিসাবে সমাধান হিসাবে চিহ্নিত করা আমাদের নিকটতম জিনিসটি হ'ল উত্তরগুলির একটি গ্রহণযোগ্য হিসাবে চিহ্নিত করা mark কেবল আপনি, প্রশ্নকারী এটি করতে পারেন। এটি করতে, উত্তরের পাশে থাকা চেক চিহ্নটি ক্লিক করুন যা আপনাকে সবচেয়ে বেশি সহায়তা করেছে। আপনি যদি কোনও উত্তর গ্রহণ করেন, আপনি আরও 2 খ্যাতি পয়েন্ট পাবেন এবং এর পরে আপনি পোস্টগুলিকে উজ্জীবিত করতে সক্ষম হবেন; আপনি যে পোস্টগুলিকে সহায়ক বলে মনে করেছিলেন সেগুলি আপনি আপগেট করতে পারেন। আরও তথ্যের জন্য, কেউ যখন আপনার প্রশ্নের উত্তর দেয় তখন কী করবে সে সম্পর্কে ট্যুর পৃষ্ঠা এবং সহায়তা পৃষ্ঠাটি দেখুন
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

1

বাছাইয়ের ফলাফলটি বাছাই করে কেন এবং তারপরে প্রতিটি লাইনের জন্য এলএস চালায় না?

find . -type f -ctime -1 | sort | while IFS= read -r filename; do ls -ls "$filename"; done

1

ls -lপনিক্সের একটি অনিং তালিকাতে তারিখগুলি সম্পর্কে এটি বলতে হয় :

<date and time>ক্ষেত্র উপযুক্ত তারিখ এবং কখন ফাইলটি সর্বশেষ সংশোধিত হয়েছিল টাইমস্ট্যাম্প থাকিতে হইবে। পসিক্স লোকালে, ক্ষেত্রটি নিম্নলিখিত তারিখের কমান্ডের সমপরিমাণ হবে:

date "+%b %e %H:%M"

... যদি ফাইলটি গত ছয় মাসে পরিবর্তন করা হয়েছে, বা:

date "+%b %e %Y"

এটিকে বিবেচনায় রেখে, এবং নিশ্চিত করে নিন যে কোনও ফাইলনামে যদি কোনও নতুন লাইন থাকে তবে তারা সঠিকভাবে পসিক্স নির্দিষ্ট ls -qবিকল্পের সাথেও গ্লোবড হয়, এগুলি lsছাড়াই কোনও ফলাফলের জন্য একটি রেজেক্স প্রস্তুত করা তুলনামূলকভাবে সহজ find:

d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"

###OUTPUT###
Jul  5 Jul  4

grepতার জন্য এবং আপনি কেবল সেই লাইনগুলিতেই ফিরে আসবেন যা আজকের বা গতকালের তারিখগুলিকে প্রতিনিধিত্ব করে স্ট্রিংগুলি ধারণ করে। নিম্নলিখিত কমান্ডটি কিছুটা যুক্ত করেছে:

ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"

ls বিকল্পগুলি সমন্বিত:

  1. -a একটি ডিরেক্টরিতে সমস্ত ফাইল ফেরত দিন - এর সাথে শুরু হওয়া ফাইলগুলিও .dot
  2. -l দীর্ঘ তালিকা
  3. -R পুনরাবৃত্তভাবে সমস্ত শিশু ডিরেক্টরি তালিকাভুক্ত
  4. -c অ্যাক্সেস সময়ের চেয়ে পরিবর্তনের সময় প্রদর্শন করুন
  5. -qকোনও ফাইলনেম ?-প্রিন্টযোগ্য বা \tআব অক্ষরের পরিবর্তে শেল গ্লোব ফিরিয়ে দিন

এই ফলাফলগুলি কেবল সেই |pipeফাইলের সাথে পাস করা হয় sedযা কেবল মেলে:

  1. কোনও পাথের নাম এবং নিম্নলিখিত রেখার পূর্ববর্তী ফাঁকা রেখা
  2. লাইনগুলি - (অন্য কথায় - dডিরেক্টরিতে নয়) দিয়ে শুরু হয় যা আপনার থাকে date
  3. এটি পথের নাম লাইনগুলি মুদ্রণ করে না যদিও তাদের নামের ডিরেক্টরিটি না থাকলে প্রকৃতপক্ষে আপনি ফিল্টার করেছেন এমন ফাইলগুলি থাকে।

আউটপুটটি দেখতে এটির মতো দেখাচ্ছে:

ls -alRcq --color=always | 
sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"

###OUTPUT###
.:
-rw------- 1 mikeserv mikeserv   2086 Jul  4 10:52 .bash_history
-rw------- 1 mikeserv mikeserv   2657 Jul  4 15:20 .lesshst
-rw-r--r-- 1 mikeserv mikeserv    681 Jul  5 05:18 .zdirs
-rw------- 1 mikeserv mikeserv 750583 Jul  5 08:28 .zsh_history
-rw-r--r-- 1 mikeserv mikeserv    166 Jul  4 23:02 Terminology.log
-rw-r--r-- 1 mikeserv mikeserv 433568 Jul  4 13:34 shot-2014-06-22_17-10-16.jpg
-rw-r--r-- 1 mikeserv mikeserv 445192 Jul  4 13:34 shot-2014-06-22_17-11-06.jpg

./.cache/efreet:
-rw------- 1 mikeserv mikeserv  37325 Jul  4 22:51 desktop_localhost_C.eet
-rw------- 1 mikeserv mikeserv  37325 Jul  4 23:30 desktop_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv  24090 Jul  4 22:51 desktop_util_localhost_C.eet
-rw------- 1 mikeserv mikeserv  24090 Jul  4 23:30 desktop_util_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv  16037 Jul  4 23:30 icon_themes_localhost.eet
-rw------- 1 mikeserv mikeserv   3117 Jul  4 23:30 icons___efreet_fallback_localhost.eet
-rw------- 1 mikeserv mikeserv 768039 Jul  4 23:30 icons_gnome_localhost.eet
-rw------- 1 mikeserv mikeserv  18589 Jul  4 23:30 icons_hicolor_localhost.eet

./.config:
-rw-r--r-- 1 mikeserv mikeserv   30 Jul  4 19:10 pavucontrol.ini

./.config/chrome:
-rw-r--r-- 1 mikeserv mikeserv 94332179 Jul  4 13:36 conf.tar.lz4.bak

হ্যাঁ, এটি এর সাথেও কাজ করে LS_COLORS- এটি সম্ভবত আপনার cronঅবশ্যই কম অগ্রাধিকার , তবে, আরে আপনার বিকল্পগুলি খোলা আছে।

যে কোনও ক্ষেত্রে এটি কিছু অন্যান্য সম্ভাব্য সমাধানগুলির চেয়ে কিছু গুরুত্বপূর্ণ সুবিধা দেয় offers

  1. প্রথম স্থানে find+ lsএকাধিক অনুরোধ জড়িত - lsএটিতে কেবল একটি একক প্রক্রিয়া জড়িত , এবং এ কারণেই এটি নির্ভরযোগ্যভাবে সমস্ত কিছু সাজিয়ে নিতে সক্ষম - যা এটি ডিফল্টরূপে করে - এবং তাই sortএটি আনুষঙ্গিকও করা হয়।

  2. কোনো সমাধান জড়িত findএবং sortএবং lsপ্রায় কাছাকাছি করছে সব দুইবার কাজ। lsএবং findউভয়ই প্রতিটি পথের নাম এবং statপ্রতিটি ফাইল সমাধান করবে । lsএবং sortউভয়ই ফলাফলের সকলকে বাছাই করবে। কেবল এককটি ব্যবহার করার পরিবর্তে এটি সম্ভবত সেরা ls

  3. তারপরে অবশ্যই এই উত্তরের অংশ dateএবং sedঅংশ রয়েছে। এ সম্পর্কে কী লক্ষণীয় তা গুরুত্বপূর্ণ যে আপনি কঠোর অংশটি করছেন এবং প্রথমে রেজেনেক্স পান - এবং শুধুমাত্র একবার - এবং পরে আপনি কেবল ফলাফলের একক তালিকায় ছাঁটাই করেন, ফলাফল পান, ফলাফল পান, ফলাফলগুলি সাজান এবং ফলাফলগুলি সাজান।

  4. এটি নতুন লাইনযুক্ত ফাইলের নামগুলি ভাঙবে না, কারণ অন্যান্য সমাধান সম্ভবত এটি করবে। এই সমাধানটির নিজস্ব ক্যাভেট রয়েছে - যা আমি পরবর্তীটি ব্যাখ্যা করি - তবে সেগুলি মিনিট এবং সহজেই পরিচালনা করা হয়। আমার মতে, এটি এখানে সবচেয়ে শক্তিশালী সমাধান।

দুটি ক্ষেত্রে রয়েছে যে উপরের কমান্ডটি আপনাকে সমস্যার কারণ হতে পারে। প্রথমটি ?ফাইলের নামগুলিতে গ্লোবগুলিকে জড়িত - যেমনটি এখানে ইতিমধ্যে দেওয়া অন্য যে কোনও তুলনায় এটি ইতিমধ্যে আরও দৃ rob় সমাধান এবং আপনি যেটির মুখোমুখি হবেন সম্ভবত ?তার পক্ষে এটি যথেষ্ট কম, এই গ্লোবগুলি সমাধান করার সম্ভাবনা রয়েছে একাধিক ফাইলের সাথে মিল থাকতে পারে। দয়া করে দেখুন এই এই বিষয় সম্পর্কে আরও তথ্যের জন্য।

অন্য সম্ভাবনাটিতে একটি মিথ্যা ধনাত্মক জড়িত - উদাহরণস্বরূপ যদি আপনার কাছে যদি কোনও ফাইলের নাম থাকে তবে dateআমরা সেই স্ট্রিংয়ের সাথে মিল রাখি যার জন্য আমরা অনুসন্ধান করছি grepতবে সেই দিনগুলির কোনওটিতেই আসলে এটি সংশোধন করা হয়নি। আমি এটি একটি সমস্যা হিসাবে গণ্য করছি না, তবে এটি যদি হয় তবে এটি সম্পর্কে জিজ্ঞাসা করুন এবং এটি পরিচালনা করতে আমি সম্ভবত আপনাকে পুনরায়তকে আরও নির্দিষ্ট করে তুলতে সহায়তা করতে পারি।


0

আপনি আসলে সন্ধান, এক্সার্গস এবং এলএস এর সংমিশ্রণটি ব্যবহার করতে পারেন।

এখানে একটি নমুনা আদেশ রয়েছে: find . -type f -print0 | xargs -0 ls -lt

  • find পুনরাবৃত্তভাবে বর্তমান ডিরেক্টরি অধীন সমস্ত ফাইল সন্ধান করবে।
  • xargs একটি তালিকাতে ফাইলের এই তালিকাটি lsকমান্ডের কাছে পাঠিয়ে দেবে ( ফাইলের findচেয়ে কম রিটার্ন প্রদান ARG_MAXকরে)।
  • ls -lt এই ফাইলগুলিকে সময় অনুসারে বাছাই করে আউটপুট ফর্ম্যাট করবে

আপনার সিস্টেমটি পুনরুদ্ধার করতে ARG_MAXআপনি টাইপ করতে পারেন:

$ getconf ARG_MAX
> 2621440

-1
ls -l $(find /home/setefgge/public_html -type f -ctime -1 | sort)

1
lsনিজস্ব বাছাই করে, সুতরাং এর findমাধ্যমে আউটপুট পাইপ sortকরা অকেজো। তবুও আপনার কমান্ড মঙ্গলে শ্বেতস্পেস (অন্যদের মধ্যে) সম্বলিত ফাইলের নাম দেয় এবং যদি খুব বেশি ফাইলের নাম থাকে তবে ব্যর্থ হবে।
গিলস 'দুষ্ট হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.