ফাইন্ড কমান্ড আউটপুট থেকে পাথ সরান


29

বিটা পরিবেশ থেকে উত্পাদন পরিবেশে কোড মোতায়েনের জন্য আমার কাছে বাশ স্ক্রিপ্ট রয়েছে তবে বর্তমানে আমাকে একটি টিএনএসটি ফাইলের ফাইলের তালিকা মনঃলি যুক্ত করতে হবে এবং কিছু সময় আমি কিছু মিস করছি। মূলত আমার স্থাপনার স্ক্রিপ্ট বিড়াল / লুপগুলি ফাইলগুলি অনুলিপি করে। (পাশাপাশি রফতানি / আমদানি ডিবি কিন্তু এটি প্রাসঙ্গিক নয়..লল)

যাইহোক, আমি findগত 14 দিনে পরিবর্তিত ফাইলগুলির একটি তালিকা তৈরি করতে কমান্ডটি ব্যবহার করতে চাই । সমস্যাটি হ'ল ./ডিপ্লোয়মেন্ট স্ক্রিপ্টটি কাজ করার জন্য আমার পথটি সরিয়ে নেওয়া দরকার ।

কমান্ড ব্যবহারের সন্ধানের উদাহরণ এখানে দেওয়া হয়েছে:

খুঁজে। -type f -mtime -14> deploy.txt

deploy.txtআমার স্থাপনার স্ক্রিপ্টে বিড়ালগুলি এখানে রেখেছে :

for i in `cat deploy.txt`; do cp -i /home/user/beta/public_html/$i /home/user/public_html/$i; done

বাশ স্ক্রিপ্টিং ব্যবহার করে এটি কীভাবে সম্পন্ন করবেন কোনও ধারণা?

ধন্যবাদ!


3
আপনি কেবল এর জন্য আরএসসিএন ব্যবহার করতে পারবেন না এমন কোনও কারণ আছে? মনে হচ্ছে আপনি যদি চাকাটিকে পুনঃসজ্জ্বলিত করতে এবং এটি একটি ত্রিভুজ তৈরি করার চেষ্টা করছেন।
ThatGraemeGuy

তবে মোতায়েনের আগে বৈধ পয়েন্টটি ডিপ্লয়ে.টেক্সট পর্যালোচনা করা হয় এবং ফিক্সিংয়ের দরকার হয় এমন কিছু সরিয়ে ফেলা হয়
মাইকি 1980

1
রিডিয়েন্সের --dry-runজন্য একটি ফাইলের মোড এবং আউটপুট এ rsync চালাতে পারেন?
জোরেডেচ

উত্তর:


36

কোনও ডিরেক্টরি তথ্য ছাড়াই কেবল ফাইল নাম মুদ্রণের জন্য আপনি -printfকমান্ড লাইন বিকল্পটি ব্যবহার করতে পারেন%f

find . -type f -mtime -14 -printf '%f\n' > deploy.txt

অথবা আপনি কেবল ./ কে সরাতে সেড ব্যবহার করতে পারেন

find . -type f -mtime -14 | sed 's|^./||' >deploy.txt

আমি বিশ্বাস করি তোমাকে পালাতে হবে /.
EEAA

5
আপনি যখন |সীমানা হিসাবে ব্যবহার করবেন না ।
ব্যবহারকারী 9517 GoFundMonica 21

3
ব্যবহার %fকেবল সমস্ত নয়, সমস্ত ডিরেক্টরি বন্ধ করে দেবে ./। যদি ফিরিয়ে দেওয়া ফাইলগুলির মধ্যে কোনও findউপ-ডিরেক্টরিতে থাকে তবে এটি তার স্থাপনার স্ক্রিপ্টটি ভেঙে দেবে ।
জেমস স্নেরিঞ্জার 21

2
@ আইইন আপনাকে .যদিও পালাতে হবে । এবং সম্ভবত একটি স্টার্ট-অফ-লাইন অ্যাঙ্কর ব্যবহার করা ভাল:s|^\./||
জেমস ও'রকম্যান

12
%Pপরিবর্তে ব্যবহার করুন %f। এটি কেবল কমান্ড লাইনে প্রদত্ত পথটি বন্ধ করে দেয়।
সত্যই

11

./নিরীহ হওয়া উচিত। সর্বাধিক প্রোগ্রাম বিবেচনা করবে /foo/barএবং /foo/./barযেমন সমতুল্য। আমি বুঝতে পারি যে এটি দেখতে খুব সুন্দর দেখাচ্ছে না, তবে আপনি যা পোস্ট করেছেন তার উপর ভিত্তি করে, এটির ফলে আপনার স্ক্রিপ্টটি ব্যর্থ হওয়ার কোনও কারণ আমি দেখতে পাচ্ছি না।

আপনি যদি সত্যিই এটিকে সরিয়ে দিতে চান sedতবে সম্ভবত এটিই সবচেয়ে পরিষ্কার উপায়:

find . -type d -mtime 14 | sed -e 's,^\./,,' > deploy.txt

আপনি যদি জিএনইউ অনুসন্ধান (যেমন বেশিরভাগ লিনাক্স সিস্টেম) সহ এমন একটি সিস্টেমে থাকেন তবে আপনি এটির সাথে একটি শটে এটি করতে পারেন find -printf:

find . -type d -mtime 14 -printf "%P\n" > deploy.txt

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


1
./উপসর্গ আসলে একটি বৈশিষ্ট্য; এটি ছাড়াই, অন্যান্য কমান্ডগুলিতে পাইপ আউটপুট সঠিকভাবে কাজ করবে না যেমন ফাইলের নামের জন্য যা ড্যাশ দিয়ে শুরু হয়।
ট্রিপলি

1
@ ট্রিপলি - আমি এর ইউটিলিটি বুঝতে পেরেছি, তবে ওপি বিশেষভাবে কীভাবে তা ছিনিয়ে নেবেন তা জিজ্ঞাসা করেছিলেন কারণ এটি তার স্থাপনার স্ক্রিপ্টের জন্য সমস্যা তৈরি করেছিল। অবশ্যই, তাঁর যা করার দরকার তা করার আরও ভাল উপায় থাকতে পারে তবে এটি যা জিজ্ঞাসিত হয়েছিল তার পরিধি ছাড়িয়ে একটি খরগোশের গর্ত।
জেমস স্নিঞ্জার

7

আপনি কেন এটি অপসারণ করা প্রয়োজন ./? কোনও পথে চলাই বৈধ। সুতরাং

cp -i dir1/./somefile dir2/./somefile

ঠিক আছে!

আপনি যদি ডিরেক্টরিটির নামটি সন্ধান করতে চান তবে আপনি %Pএটিতে আরগটি ব্যবহার করতে পারেন -printf

মানুষের সন্ধান (1) বলেছেন:

         %P     File's name with the name of the  command  line  argument
                 under which it was found removed.

একটি উদাহরণ

$ find other -maxdepth 1
other
other/CVS
other/bin
other/lib
other/doc
other/gdbinit
$ find other -maxdepth 1 -printf "%P\n"

CVS
bin
lib
doc
gdbinit

প্রথম ফাঁকা লাইন মন! আপনি যদি এড়াতে চান তবে এটি ব্যবহার করুন-mindepth 1

$ find other -mindepth 1 -maxdepth 1 -printf "%P\n"
CVS
bin
lib
doc
gdbinit

3

আচ্ছা আপনার কাছে কয়েকটি বিকল্প রয়েছে। আপনি -printfকেবল ফাইলের নাম মুদ্রণ করতে বিকল্পটি ব্যবহার করতে পারেন , বা আপনি কেবল ছাঁটাইয়ের জন্য সেডের মতো একটি সরঞ্জাম ব্যবহার করতে পারেন ./

# simply print out the filename, will break if you have sub-directories.
find . -mtime -14 -printf '%f\n'

# strip a leading ./
find .  -mtime -14 | sed -e 's/^\.\///'

আপনি কি এর ব্যবহারের একটি উদাহরণ দিতে পারেন? দুঃখিত, লিনাক্স আসলে আমার দুর্গ নয়
মাইকি 1980

2
আবার দেখুন, উদাহরণ আছে।
জোরেডেচ

সম্মত - কেবল এটি চেষ্টা করুন, আপনি অনুসন্ধান এবং সেডের সংমিশ্রণে কোনও কিছুতে আঘাত করতে যাচ্ছেন না।
EEAA

3

"ফাইন্ড-প্রিন্টফ" সমাধানটি ফ্রিবিএসডি-তে কাজ করবে না কারণ সন্ধানের মতো বিকল্প নেই। এক্ষেত্রে এডাব্লুকে সহায়তা করতে পারে। এটি একটি শেষ নাম ($ NF) দেয়, যাতে এটি যে কোনও গভীরতায় কাজ করতে পারে।

find /usr/local/etc/rc.d -type f | awk -F/ '{print $NF}'

পিএস: ডি ট্যান্সলে "লিনাক্স এবং ইউনিক্স শেল প্রোগ্রামিং" বই থেকে নেওয়া


2

একটি দ্রুত সমাধান, যদি আমি সঠিকভাবে প্রশ্নটি বুঝতে পারি cutতবে findকমান্ডের আউটপুট ব্যবহার করা হচ্ছে :

$> find . -type f -mtime -14 | cut -b 3- > deploy.txt

এটি ফলাফলের প্রতিটি লাইন (আপনার ক্ষেত্রে ./) থেকে প্রথম অক্ষরগুলিতে ফিরবে । সম্ভবত সেরা সমাধান নয়, তবে আপনার দৃশ্যে কাজ করে।


1

sed জিনিস এই ধরণের জন্য নিখুঁত।

$ find . -type f -mtime -14 find . | sed 's/^\.\///' > deploy.txt

1

আমি জানি না যে আমরা কী ধরনের ফাইলের নাম নিয়ে কথা বলছি, তবে স্পেস বা নিউলাইনগুলি সহ যে কোনও কিছুই এখানে সমাধানের বেশিরভাগ ঝুঁকিতে ফেলেছে।

আমার পরামর্শটি হ'ল প্রতিটি ফাইলের নাম থেকে অক্ষরের ফালাটি খোলার জন্য শেলের প্যারামিটার সম্প্রসারণ ব্যবহার করা হবে:

find . -mtime -14 -exec sh -c 'printf "${0#./}\n"' {} \; >deploy.txt

আপনি যদি সত্যিই পাইপগুলি পছন্দ করেন তবে প্রতিটি ফাইলের নাম পেতে xargs সহ আপনি একটি "নিরাপদ" ডিলিমিটার ব্যবহার করতে পারেন:

find . -mtime -14 -print0 | xargs -0 -n 1 sh -c 'printf "${0#./}\n"' >deploy.txt

মনে রাখবেন এই আউটপুট হয় না যখন এটি টাকে চেক জন্য যথেষ্ট হতে পারে, নাল-সীমা নির্দেশ করা তাই হয়, এই সমস্যার সমাধান কেউ, একটি deploy.txt যে ফাইলটি অটোমেশন জন্য ব্যবহার করা নিরাপদ উত্পাদন, যদি না আপনি আপনার সোর্স সম্পর্কে খুব আত্মবিশ্বাসী ফাইলের নামের।

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