যে ফাইলগুলির মধ্যে কোন সিমলিঙ্ক বিদ্যমান নেই তার তালিকা আমি কীভাবে করব?


10

আমার কাছে বিবিধ দস্তাবেজগুলিতে পূর্ণ একটি "মাইফিলস" ডিরেক্টরি রয়েছে এবং এর কাঠামোটি পরিবর্তন করতে চাই না।

অতএব আমি নথির প্রতিটি শ্রেণীর জন্য অন্যান্য বেশ কয়েকটি ডিরেক্টরি তৈরি করেছি। উদাহরণস্বরূপ, আমি একটি "চিত্র" ডিরেক্টরির প্রতিটি symlinks হয়েছে আছে .jpgবা .cr2বিবরণ এবং অন্যান্য মেটাডেটা সঙ্গে প্রতিটি সিমবলিক লিঙ্ক (একই ফাইলের নাম সহ) জন্য "myfiles" ডিরেক্টরির প্লাস অন্যান্য বর্ণনামূলক ফাইলের মধ্যে ফাইল। / চিত্র ডিরেক্টরিতে থাকা সিমলিংকের মূল লিঙ্কযুক্ত ফাইলের থেকে আলাদা নাম থাকতে পারে।

আমি "মাইফিলস" ডিরেক্টরিতে প্রতিটি চিত্র ফাইলের "চিত্র" ডিরেক্টরিতে একটি সিমিলিংক রয়েছে তা নিশ্চিত করার সহজতম উপায়টি খুঁজতে চেষ্টা করছি।

ফোল্ডার কাঠামোর একটি উদাহরণ দেখুন

/myfiles/a.doc
/myfiles/b.jpg
/myfiles/c.cr2
/myfiles/d.mov

ফলাফল করা উচিত

/images/b_800x600.jpg
/images/b_800x600.desc
/images/c_3820x5640.cr2
/images/c_3820x5640.cr2

পুরো উত্তর নয় তবে আপনি find /myfiles -type fকোনও ফাইলের ফলাফলগুলি সংরক্ষণ করতে পারেন তারপরে সিলেক্ট করা find /images -type l -exec readlink {} \; | egrep myfilesফাইলগুলির একটি তালিকা পেতে ব্যবহার করতে পারেন /imagesএবং ফলাফলগুলি পুনরুদ্ধার sedকরে প্রতিটি ফাইলের উপরের পাথগুলি মুছে ফেলার জন্য যে ফাইলগুলি ইতিমধ্যে সংরক্ষণ করা হয়েছে সেহেতু সিমবলিক লিঙ্ক আছে এবং ফাইল অবশিষ্ট যে ফাইল না সিমবলিক লিঙ্ক আছে।
ব্র্যাচলে

2
পরিবর্তে আপনার পক্ষে হার্ডলিঙ্কগুলি ব্যবহার করা কি সম্ভব, তাই আপনার লিঙ্ক আছে কিনা তা দেখার জন্য আপনি হার্ডলিঙ্ক কাউন্টারটি ব্যবহার করতে পারেন? ls -lআপনি ব্যবহার করে দ্বিতীয় কলামে হার্ডলিঙ্ক গণনা দেখতে পাবেন।
ল্যামবার্ট

@ ল্যামবার্ট যা বলে তা করুন। rmএই pax -rwl -s "\|.*regex|modifes_filename|" /path/to/myfiles/*.jpg /path/to/jpg_dirসিএমলিংক ডায়ার করে এবং উদাহরণস্বরূপ কেবলমাত্র আপনার জেপিএসের সাথে মেলে এমন ফাইলগুলির জন্য প্রোগ্রামিকভাবে পরিবর্তিত ফাইল নামগুলির সাথে হার্ডলিঙ্কগুলি পেতে ব্যবহার করুন । আপনি এর থেকে অনেক কিছু অর্জন করতে পারবেন - যেমন পরিবর্তনের সময় এবং ইত্যাদির উপর ভিত্তি করে
ব্যাচিং

উত্তর:


6

যদি আমি প্রশ্নটি সঠিকভাবে আন্ডারউড করি তবে আপনার মাইফিলগুলিতে এমন ফাইলগুলির দরকার আছে যাগুলিতে চিত্রগুলিতে সিমলিংক নেই:

#!/bin/bash

OIFS="$IFS"
IFS=$'\n'

files="$(find myfiles/ -type f -name '*.jpg' -or -name '*.cr2')"
for f in $files; do
    list="$(find -L images/ -xtype l -samefile "$f")"
    if [[ "$list" == "" ]]; then
        echo "$f does not have symlink."
    fi
done

IFS="$OIFS"

ডিরেক্টরি মাইফাইলস / 1 এ আপনার কাছে ajpg ফাইল রয়েছে এবং ডিরেক্টরিতে ইমেজ / 3-এ কেবল সেই ছবিতে একটি ফাইলের সাথে একটি সিমিলিংক রয়েছে অথবা কেবল ফাইল / মিসিং সিমলিংকের সাথে ফাইলটির প্রতিবেদন করা হবে না যদি এই পদ্ধতির সাথে একটি সতর্কতা রয়েছে।


ধন্যবাদ! হ্যাঁ আপনি সঠিকভাবে বুঝতে পেরেছিলেন। বন্ধ কিন্তু বেশ না। আমার দোষ আপনার নয় :-) আমি যে উদাহরণ দিয়েছি তা একটি সরল মাইফাইল ডিরেক্টরি দেখায়। বাস্তবে মাইফিলসের অধীনে চিত্র ফাইলগুলি নেস্টেড ডিরেক্টরিগুলির যেকোন স্বেচ্ছাসেবী স্তরের ভিতরে থাকতে পারে।
রবার্ট আলেকজান্ডার

আমি পুরো মাইফিলগুলিতে অনুসন্ধানের উত্তরটি সম্পাদনা করেছি, তবে এটি যা আপনার ইচ্ছা তা পরীক্ষা করে দেখুন।
ট্যালিজিন

প্রায় সেখানে :-) ফাইলগুলি ফাঁকা রাখলে আপনার স্ক্রিপ্টটি হিচাপ হয় (এবং সম্ভবত অন্যান্য ক্র্যাপগুলি যেমন একক অ্যাড্রোসফেসগুলির মধ্যে রয়েছে "...
রবার্ট আলেকজান্ডার

আমার মনে হয় এখন ঠিক হওয়া উচিত
ট্যালিজিন

আপনার শেষ পরিবর্তনটি প্রতিটি অক্ষরের উপস্থিতিতে প্রতিটি চ বিভক্ত হয়! :-) আমি আইএফএস লাইনটি আইএফএসে ছড়িয়েছি = তারপরে কীবোর্ড থেকে একটি নতুন লাইন এবং অন্য "। এখন বিভাজনটি কাজ করছে বলে মনে হচ্ছে তবে আমি" মিসিংলিংস.শ: ১১: মিসিংলিংস.এসএস: এর একটি দীর্ঘ ক্রম পেয়েছি: [[: পাওয়া যায়নি) "
রবার্ট আলেকজান্ডার

3

আমি ধরে নিলাম যে ফাইলগুলি এর অধীনে myfilesপ্রতীকী লিঙ্ক নয় এবং ফাইলের নামের কোনওটিতেই নিউলাইন নেই। (এই অনুমানগুলি লঙ্ঘন করা হলেও আমার পদ্ধতি এখনও কার্যকর হতে পারে তবে এটি আরও জটিল হয়ে ওঠে)) আমি এটিও ধরে নিয়েছি যে আপনার সাধারণ readlinkইউটিলিটি রয়েছে এবং এটি -fলথ লিনাক্সের (জিএনইউ এবং ব্যাসি বক্স) উভয় ক্ষেত্রেই প্রচলিত পথগুলিকে সমর্থন করে তবে এটি নয় যেমন ওএসএক্স।

ফাইলগুলির একটি তালিকা তৈরি করুন এবং ভাল পরিমাপের জন্য এটি বাছাই করুন:

find /myfiles -type f -print | sort >all.list

নিখুঁত পাথ সহ প্রতীকী লিঙ্ক লক্ষ্যগুলির একটি তালিকা তৈরি করুন।

find /images -type f -exec readlink -f {} \; | sort >linked.list

লিঙ্কযুক্ত নয় এমন ফাইলগুলির তালিকা করুন:

comm -32 all.list linked.list

আপনি যদি এমন শেল ব্যবহার করেন যা প্রক্রিয়া প্রতিস্থাপনকে সমর্থন করে, আপনি এটি সমস্ত কমান্ডে রাখতে পারেন:

comm -23 <(find /myfiles -type f -print | sort) \
         <(find /images -type f -exec readlink -f {} \; | sort)

যদি এর অধীন লিঙ্কগুলি /imagesনিখুঁত হয় তবে আপনি বিকল্প readlinkব্যতীত ব্যবহার করতে পারবেন -f, যা * বিএসডি এবং ওএসএক্স এর অধীন উপলব্ধ।


আমি আপনার commকমান্ডের মতো কিছু পোস্ট করতে চলেছিলাম তবে আমি এখন আপনাকে দেখতে পাচ্ছি না যে আপনি ইতিমধ্যে করেছেন। যাইহোক, পুনর্নির্দেশ থেকে sortকোনও অর্থ নেই; তারপরে প্রক্রিয়া বিকল্পগুলি কোনও কিছুই আউটপুট দেয় না। এছাড়াও, আপনি যদি এমন অনেকগুলি ডিরেক্টরি যুক্ত করতে /imagesপারেন যে আপনি ফাইলগুলি খুঁজতে চান /myfilesযা ছাড়াও বেশ কয়েকটি ডিরেক্টরি থেকে কোনও ডিরেক্টরি থেকে সিমলিঙ্ক করা হয় না /images
ট্রিপলি

1
দেখুন stackoverflow.com/questions/7665/... বিকল্প জন্যreadlink -f
tripleee

@ ট্রিপলি আমি প্রক্রিয়া পুনঃনির্দেশ সংস্করণটি তৈরি করার সময় পুনঃনির্দেশটি বের করতে ভুলে গিয়েছিলাম, ধন্যবাদ। হ্যাঁ, আপনি সহজেই অন্যান্য ডিরেক্টরি যুক্ত করতে পারেন বা অন্যান্য পরিবর্তন করতে পারেন।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.