আমাকে মুছে ফেলা ডিরেক্টরিটি কেন সিডি করতে হবে?


19

আমার সার্ভারে আমার একটি ডিরেক্টরি কাঠামো দেখতে এরকম কিছু দেখাচ্ছে:

/myproject/code

আমার সার্ভারের সাথে সাধারণত একটি এসএসএস সংযোগ থাকে এবং সেই ডিরেক্টরিতে 'স্ট্যান্ড' থাকে:

root@machine:/myproject/code#

আমি যখন আমার কোডের একটি নতুন সংস্করণ স্থাপন করি, কোড ডিরেক্টরিটি সরানো হয় তাই আমার সাথে বাকি রয়েছে:

root@machine:/myproject/code# ./run
-bash: ./run: No such file or directory

এবং আমি একমাত্র সমাধান খুঁজে পেয়েছি সিডি আউট এবং ফিরে:

root@machine:/myproject/code# cd ../code
root@machine:/myproject/code# ./run
Running...

আমি কি এড়াতে পারি? এটি কিছুটা অদ্ভুত আচরণ। কেন এমন হয় তার যদি আপনার একটি সুন্দর ব্যাখ্যা থাকে তবে আমি এটির প্রশংসা করব।


5
আপনি কি নিজের কোড ডিরেক্টরিতে ফাইল কোড অপসারণের কথা ভেবেছেন, কোড ডিরেক্টরি নিজেই নয়?
স্ট্রংব্যাড

9
আপনি ভুল করেছেন যে নতুন তৈরি করা ডিরেক্টরিটি runপুরানো ডিরেক্টরি হিসাবে একই। এটিতে কেবল একই নাম এবং পিতামাতার ডিরেক্টরি রয়েছে। আপনার নিজের পুরানো গাড়িটি ছাড়ে এবং ঠিক একই রঙ এবং মডেলের একটি নতুন গাড়ি কেনার সাথে এটির তুলনা করুন: আপনি কাঁপানো গাড়ীতে বসে বসতে চান না এবং আশা করেন যে আপনি কোনও নতুন ক্ষতিহীন অবস্থায় শেষ করেছেন, তাই না?
অ্যান্টন

2
অ্যান্টন: আমি যা অনুমান করি তা হল পথটিই ডিরেক্টরিটি চিহ্নিত করে। আমার কাছে "সিডি .. / কোড" একটি নূপুর। কেন তা হচ্ছে না শুনে আমি খুব আগ্রহী।
মার্কাস জোহানসন

2
@ মারকাস জোহানসন cd ../codeকোনও নোপ নয়। ..আপনার যে পথটি ছিল বা হয়েছে তা পিতামাতার জন্য একটি শর্টকাট। যদি আপনার বর্তমান ডিরেক্টরিটি মুছে ফেলা হয় তবে পিতৃপথটি এখনও বিদ্যমান থাকতে পারে এবং এই ক্ষেত্রে মূল্যায়ন করে পৌঁছানো যায় ..। সেই ডিরেক্টরিতে 'কোড' নামের একটি ডিরেক্টরিতে অনুসন্ধান করা হয়।
অ্যান্টন

2
@ মারকাসজোহানসন কোড অপসারণ এবং টেরিংয়ের পরিবর্তে, উপলভ্য যে কোনও সংস্করণ নিয়ন্ত্রণ সরঞ্জাম ব্যবহার করার জন্য আমি সুপারিশ করব। আপডেট ভাগ করা আরও সহজ (ভুলভাবে চাপ দিন বা টানুন) এবং ভুল ফাইলগুলি দুর্ঘটনাক্রমে মোছার জন্য কম বিকল্প। এবং আপনি ডিফল্টরূপে পুরানো সংস্করণ রাখেন।
বার্নহার্ড

উত্তর:


26

আমার কাছে "সিডি .. / কোড" একটি নূপুর। কেন তা হচ্ছে না শুনে আমি খুব আগ্রহী।

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

যখন একটি নতুন ডিরেক্টরি codeতৈরি করা হয়, এটি একটি নতুন ইনোডের সাথে যুক্ত হয় এবং এটি সেখানে। পূর্বে মুছে ফেলা ফাইল এবং ডিরেক্টরিগুলির কোনও রেকর্ড নেই, সুতরাং সিস্টেমের দ্বারা এটি কোন ইনোডটি দখল করত তা পরীক্ষা করতে পারে এবং আশেপাশের জিনিসগুলিকে পরিবর্তন করতে পারে যাতে এটি আবার একই থাকে; এই জাতীয় সিস্টেমটি দ্রুত অকার্যকর হয়ে উঠবে, এবং যে কোনও ক্ষেত্রে এটি সম্ভবত কোনও গ্যারান্টি নয় যে আপনি আবার সেখানে ফিরে আসবেন - এটি এক ধরণের অনাকাঙ্ক্ষিত হবে, কারণ এর অর্থ এটি যদি কোনও ডিরেক্টরি তৈরি করা হয় তবে আপনি দুর্ঘটনাক্রমে অন্য কোথাও পৌঁছে যেতে পারেন means এটি আপনার (বর্তমানে অব্যক্ত) ইনোড নেয়।

আমি নিশ্চিত নই যে এই শেষ সম্ভাবনাটি বিদ্যমান কিনা, বা আপনার বর্তমান কার্যক্ষম ডিরেক্টরিকে নির্ধারিত মুছে ফেলা ডিরেক্টরিটির ইনোডটি যদি ট্র্যাক করা হয় যাতে কোনও সময়কালে এটি নির্ধারিত হবে না ইত্যাদি etc.


3
এটিই এখানে আসল উত্তর।
karan.dodia

14

পরবর্তী কমান্ডটি কার্যকর করার আগে আপনার শেলটি প্রতিবার শেষ কমান্ড চলাকালীন যে পথে ছিল তা করতে একটি করে নাcd

আপনি বর্তমান ডিরেক্টরিটি মুছে ফেলেছেন এবং একই নামের সাথে একটি ডিরেক্টরি তৈরি করেছেন যা একই ডিরেক্টরি নয়, কেবল একই নাম / পথের কিছু।

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

cdপরবর্তী কমান্ডটি কার্যকর করার আগে একটি শেল বর্তমান ডিরেক্টরিতে প্রবেশ করতে পারে , আমি এমন কিছু সম্পর্কে অবগত নই (অথবা এটি করার জন্য কনফিগার করা যেতে পারে)।


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

4

বেশিরভাগ ইউনিক্স-মতো সিস্টেমে কোনও প্রক্রিয়াটির জন্য "বর্তমান ডিরেক্টরি" ফাইলের বিবরণী হিসাবে ডিরেক্টরিটি নির্দেশ করে কার্নেলের মধ্যে সংরক্ষণ করা হয়। কার্নেলটি প্রকৃতপক্ষে বর্তমান ডিরেক্টরিটির পথ সঞ্চয় করে না: সেই তথ্যটি আপনার শেল দ্বারা ট্র্যাক করা হয়েছে।

একটি ফাইলসাইটিজ অবজেক্ট (ফাইল বা ডিরেক্টরি) কেবল তখনই ধ্বংস হয় যখন এর সাথে সমস্ত ফাইল সিস্টেমের লিঙ্কগুলি চলে যায় এবং সেখানে কোনও ফাইল বর্ণনাকারী সেই বস্তুর দিকে নির্দেশ করে না।

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

এইভাবে, আপনি যখন cd ../code(বা, অনেকগুলি শেলের উপর cd .) করেন, আপনি আসলে ফাইল সিস্টেমের স্তরক্রমকে অনুসরণ করছেন এবং পুরানো ঠিকানায় থাকা নতুন ডিরেক্টরিতে যাচ্ছেন ।

সাদৃশ্য অনুসারে, ডিরেক্টরিটি সরিয়ে ফেলা জোর করে কোনও জঞ্জাল ডাম্পের দিকে বাড়ি চলে যাওয়ার মতো (পূর্ববর্তী ঠিকানার সাথে সম্পর্ক ছিন্ন করা)। যদি সেখানে এখনও কেউ বাস করেন (এটি তাদের হিসাবে ব্যবহার করা হয় cwd) তবে ঘর ছড়িয়ে দেওয়ার আগে তাদের চলে যেতে হবে। ইতিমধ্যে, পুরানো ঠিকানায় একটি নতুন-নতুন বাড়ি তৈরি করা যেতে পারে।


0

@Anthon, কারণ সাফ কেন ঘটনাচক্রে
সমাধান আপনি ব্যবহার করতে পারেন হিসাবে ওরফে , উদাহরণস্বরূপ হিসাবে:

alias 1234='PROJECT=`pwd`; cd $PROJECT ; ./run'

ব্যাশের জন্য উপাধিগুলি ~ / .bashrc এ রাখা হয়


0

নিশ্চিত করা বর্তমান ওয়ার্কিং ডিরেক্টরিটি ইনোড নম্বরের উপর ভিত্তি করে, আপনি সেখানে যাবার জন্য যা দেখেছিলেন তা নয়। যেহেতু আপনি ব্যাশ ব্যবহার করছেন, আপনি একই নামের নতুন ডিরেক্টরিতে সিডি করতে নিম্নলিখিত $ PWD ব্যবহার করতে পারেন:

সিডি $ পিডাব্লুডি

উদাহরণস্বরূপ, আমি একটি ডামি মোতায়েন কমান্ড করেছি:

set -x
cd ~/tmp
rm -rf code
mkdir code
echo echo hello from $* > code/run
chmod +x code/run

প্রথম স্থাপনা তৈরি করা হয়েছে, সিডিতে কোড করুন এবং তারপরে সামগ্রীগুলি পরীক্ষা করা হয়েছে ls -laiযাতে আপনি ইনোডগুলি দেখতে পারেন:

ianh@abe:~/tmp$ ./,deploy first
++ cd /home/ianh/tmp
++ rm -rf code
++ mkdir code
++ echo echo hello from first
++ chmod +x code/run
ianh@abe:~/tmp$ cd code
ianh@abe:~/tmp/code$ ls -lai
total 12
22945913 drwxr-xr-x  2 ianh ianh 4096 Apr  9 23:12 .
22937618 drwxrwxr-x 14 ianh ianh 4096 Apr  9 23:12 ..
22939455 -rwxr-xr-x  1 ianh ianh   22 Apr  9 23:12 run

এবার ২ য় মোতায়েন চালান

ianh@abe:~/tmp/code$ ../,deploy 2nd
++ cd /home/ianh/tmp
++ rm -rf code
++ mkdir code
++ echo echo hello from 2nd
++ chmod +x code/run

এবং ডিরেক্টরি সামগ্রী পরীক্ষা করুন ... এখন ডিরেক্টরিতে কিছুই নেই! এমনকি '।' এবং '..'! এ থেকে আপনি দেখতে পাবেন যে বাশ যখন আপনি cd .... থেকে চালাচ্ছেন তখন '..' ডিরেক্টরি এন্ট্রি ব্যবহার করছে না .. পিডাব্লুডি হ্যান্ডলিংয়ের অংশটি আমি অনুমান করি। কিছু অন্যান্য / পুরানো শেল cd ..এই পরিস্থিতিতে পরিচালনা করে না, আপনাকে প্রথমে একটি পরম পথে সিডি করতে হবে।

ianh@abe:~/tmp/code$ ls -lai
total 0

সিডি করতে $PWDএবং আবার চেষ্টা করুন:

ianh@abe:~/tmp/code$ cd $PWD
ianh@abe:~/tmp/code$ ls -lai
total 12
22945914 drwxr-xr-x  2 ianh ianh 4096 Apr  9 23:12 .
22937618 drwxrwxr-x 14 ianh ianh 4096 Apr  9 23:12 ..
22939455 -rwxr-xr-x  1 ianh ianh   20 Apr  9 23:12 run
ianh@abe:~/tmp/code$ ./run
hello from 2nd

বর্তমান ডিরেক্টরি (।) এর ইনোড কীভাবে পরিবর্তিত হয়েছে তা নোট করুন?

যদি আপনার মোতায়েন করা স্ক্রিপ্টটি পুরানো ডিরেক্টরিটিকে অন্য কোনও নামে সরিয়ে নিয়েছে, যেমন mv code code.$$উপরের মোস্তাক স্ক্রিপ্টে, তবে ./runকাজ করবে তবে আপনি ব্যবহার না করা অবধি পুরানো কোডটি cd $PWDচালাবেন , নতুন নয়।

ianh@abe:~/tmp/code$ ./run
hello from 2nd
ianh@abe:~/tmp/code$ ../,deploy 3rd
++ cd /home/ianh/tmp
++ '[' -d code ']'
++ mv code code.9629
++ mkdir code
++ echo echo hello from 3rd
++ chmod +x code/run
ianh@abe:~/tmp/code$ ./run
hello from 2nd
ianh@abe:~/tmp/code$ cd $PWD
ianh@abe:~/tmp/code$ ./run
hello from 3rd

ক্যাপিস্ট্রানো ব্যবহার করে স্থাপনের ক্ষেত্রেও একই সমস্যা রয়েছে (তাদের বর্তমানের বর্তমান নাম থেকে বর্তমানের সাথে একটি সিমিলিংক রয়েছে), তাই আমি উত্পাদন / মঞ্চস্থ অঞ্চলে সিডির পাশাপাশি এলএআইএলস রাখার পাশাপাশি RAIL_ENV যথাযথভাবে সেট করি:

alias cdp='export RAILS_ENV=production; echo RAILS_ENV=$RAILS_ENV ; cd /var/www/www.example.com/current'
alias cds='export RAILS_ENV=staging; echo RAILS_ENV=$RAILS_ENV ; cd /var/www/staging.example.com/current'

0

আমি যা অনুমান করি তা হল পথটি যা ডিরেক্টরিকে চিহ্নিত করে।

কোনও কিছুর পথ হ'ল আপনি কীভাবে সেখানে যাবেন, জিনিসটি নিজেই নয়। আপনার বিছানার দিকে যাওয়ার পথটি আপনার ঘরে যেতে পারে তবে আপনি যখন একবার বিছানায় পড়ে যান, কেউ যদি এটি ধরে বাইরে নিয়ে যায় তবে আপনি আর আপনার ঘরে থাকবেন না।


0

একটি স্ব-অন্তর্ভুক্ত উত্তর নয়, তবে আমার একটি অতিরিক্ত পয়েন্ট রয়েছে, যা মন্তব্য করার মার্জিনটি খুব কম ছিল।

প্রাসঙ্গিক ফাইল সিস্টেমে একটি ডিরেক্টরি কেবল একটি পাথের চেয়ে বেশি, এই ধারণার জন্য আরও ভাল অনুভূতি পাওয়ার জন্য, অন্য একটি প্রক্রিয়াটির বর্তমান কার্যকরী ডিরেক্টরিটি সরানোর চেষ্টা করুন: একটি শেলের মধ্যে, একটি ইন্টারেক্টিভ পাইথন সেশন শুরু করুন:

$ python
>> import os
>> os.getcwd()
'/home/you/hocus'

তারপরে, অন্য শেলটিতে যান এবং সেই ডিরেক্টরিটি সরান:

$ cd /home/you
$ mv hocus pocus

মূলটিতে ফিরে যান:

y পাইথন
>> ওএস আমদানি করুন
>> os.getcwd ()
'/ হোম / আপনি / ধোঁকা'
>> os.getcwd ()
'/ হোম / আপনি / দেত্তয়া'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.