এমন কোনও ওয়ান-লাইনার রয়েছে যা আমাকে একই সাথে একটি ডিরেক্টরি তৈরি করতে এবং এতে প্রবেশ করতে দেয়?


150

আমি নিজেকে প্রচুর পুনরাবৃত্তি করতে দেখি:

mkdir longtitleproject
cd longtitleproject

ডিরেক্টরি নামটি না বার করে কি এক লাইনে এটি করার কোনও উপায় আছে? আমি এখানে বাশ এ।




1
mkdir longtitleprojectতারপরেcd !^
user262826

এছাড়াও উপর আচ্ছাদিত হয়েছে askubuntu.com/q/927463/295286 এবং askubuntu.com/q/249314/295286
Sergiy Kolodyazhnyy

উত্তর:


160

কোন বিল্ট-ইন কম্যান্ড, কিন্তু আপনি সহজেই একটি ফাংশন যা কল লিখতে পারেন mkdirতারপর cd:

mkcd () {
  mkdir "$1"
  cd "$1"
}

এই ~/.bashrcফাইলটি আপনার ফাইলে রাখুন (বা ~/.kshrcksh ব্যবহারকারীদের ~/.zshrcজন্য বা zsh ব্যবহারকারীদের জন্য)। এটা একটা ফাংশন বলা সংজ্ঞায়িত mkcd"$1"আপনি যখন এটি চালান তখন ফাংশনের যুক্তি দ্বারা প্রতিস্থাপন করা হবে।

এই সাধারণ সংস্করণটিতে বেশ কয়েকটি ত্রুটি রয়েছে:

  • আপনি একবারে উপ-ডিরেক্টরিগুলির একটি শৃঙ্খলা তৈরি করতে পারবেন না। ঠিক করুন: -pবিকল্পটি পাস করুন mkdir। (এটি পছন্দসই হতে পারে বা নাও হতে পারে, কারণ এটি টাইপোর অনির্দিষ্ট হওয়ার ঝুঁকি বাড়ায়, যেমন mkcd mydierctory/newsubআনন্দের সাথে তৈরি করবে mydierctoryএবং mydierctory/newsubআপনি যখন newsubবিদ্যমানটির ভিতরে তৈরি করতে চেয়েছিলেন mydirectory।)
  • যুক্তি দিয়ে শুরু হয়, তাহলে -কিন্তু ঠিক নয় -, তবে mkdirএবং cdএকটি বিকল্প যেমন ব্যাখ্যা করা হবে। যদি এটি ন্যায়সঙ্গত হয় -তবে এর cdঅর্থ এটি ব্যাখ্যা করবে $OLDPWD। যদি এটি +0 বা আরও বেশি সংখ্যার পরে আসে তবে cdzsh এটিকে ডিরেক্টরি স্ট্যাকের সূচক হিসাবে ব্যাখ্যা করবে interpret আপনি প্রথম সমস্যাটি ঠিক করতে পারেন, তবে অন্য দুটি নয়, তর্কটির --আগে পেরিয়ে। যদি আপনি ./কোনও আপেক্ষিক পথটি থাকেন তবে যুক্তিটিকে প্রিপেন্ড করে আপনি এই সমস্ত সমস্যার সমাধান করতে পারেন।
  • mkdirঅনুসরণ করে না CDPATH, তবে cdতা করে না , তাই আপনি যদি CDPATHএমন কোনও মান সেট করে থাকেন যা শুরু হয় না .(স্বীকার করে নেওয়া কিছুটা অস্বাভাবিক কনফিগারেশন), তবে cdসবেমাত্র তৈরি হওয়া থেকে আলাদা ডিরেক্টরিতে আপনাকে নিয়ে আসতে পারে। Prepending ./আপেক্ষিক পাথ এই সংশোধন করা হয়েছে (এটা ঘটায় CDPATHউপেক্ষা করা হয়)।
  • যদি mkdirব্যর্থ হয়, এটি কার্যকর করার চেষ্টা করে cd। ফিক্স: &&দুটি কমান্ড পৃথক করতে ব্যবহার করুন ।

এখনও মোটামুটি সহজ:

mkcd () {
  case "$1" in /*) :;; *) set -- "./$1";; esac
  mkdir -p "$1" && cd "$1"
}

এই সংস্করণটিতে এখনও একটি প্রান্ত ক্ষেত্রে তৈরি হওয়া একটি cdথেকে আলাদা ডিরেক্টরিতে যাওয়ার সম্ভাবনা রয়েছে mkdir: যদি যুক্তিটি যদি একটি প্রতীকী লিঙ্কের সাথে mkcdথাকে ..এবং যায় তবে। উদাহরণস্বরূপ, যদি বর্তমান ডিরেক্টরিটি হয় /tmp/hereএবং mylinkএটি একটি প্রতীকী লিঙ্ক হয় /somewhere/else, তবে যেখানে পরিবর্তন হয় সেখানে mkdir mylink/../fooতৈরি করে । আর্গুমেন্টে প্রতীকী লিঙ্কগুলি সন্ধান করার পক্ষে এটি যথেষ্ট নয়, কারণ শেলটি তার নিজস্ব বর্তমান ডিরেক্টরিতে প্রতীকী লিঙ্কগুলিও ট্র্যাক করে , তাই নতুন ডিরেক্টরিতে ( ) পরিবর্তন করে না তবে পরিবর্তিত হয় না । এর একটি স্থিরতা হ'ল বিল্টিনকে প্রথমে সমস্ত পাথ উপাদানগুলিকে সমাধান করতে দেয় ( যদি তা ব্যবহার করা হয় তবে তা বোঝা যায় না/somewhere/else/foocd mylink/../foofoocd /tmp/mylink; mkdir ../foo; cd ../foo/somewhere/else/foo/tmp/foocd..foo/..fooঅস্তিত্ব নেই, তাই mkdirকখনও কোনও দেখার দরকার নেই ..)।

কিছুটা দুরন্ত সংস্করণে আমরা এই দৃust়তায় আসি:

mkcd () {
  case "$1" in
    */..|*/../) cd -- "$1";; # that doesn't make any sense unless the directory already exists
    /*/../*) (cd "${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd -- "$1";;
    /*) mkdir -p "$1" && cd "$1";;
    */../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "./$1";;
    ../*) (cd .. && mkdir -p "${1#.}") && cd "$1";;
    *) mkdir -p "./$1" && cd "./$1";;
  esac
}

(অনুশীলন: আমি কেন প্রথম cdকলের জন্য সাবসেল ব্যবহার করছি ?)

যদি mkdir ব্যর্থ হয়, আমি বর্তমান ডিরেক্টরিটি পরিবর্তন না করার বিষয়ে নিশ্চিত হতে চাই। সিডির সাথে ফিরে পরিবর্তন করা - বা শেলটির বর্তমান ডিরেক্টরিতে পরিবর্তনের অনুমতি না থাকলে $ OLDPWD যথেষ্ট ভাল নয়। এছাড়াও, সিডি আপডেটগুলি ওলডিপিডাব্লুডি কল করা, সুতরাং আমরা কেবল এটি একবার করতে চাই (বা ওলডিপিডাব্লুডি পুনরুদ্ধার করুন)।


পূর্ববর্তী লাইনটি থেকে শব্দটি পুনরায় টাইপ না করার জন্য কয়েকটি বিশেষ উপায়ও রয়েছে:

  • প্রকার cd , তারপর Esc .(অথবা Alt+ + .) পূর্ববর্তী হুকুম থেকে গত যুক্তি সন্নিবেশ করতে।
  • cd !$cdপূর্ববর্তী কমান্ডের সর্বশেষ যুক্তি প্রয়োগ করে exec
  • প্রেস Upপূর্ববর্তী কমান্ড লাইন প্রত্যাহার, তারপর পরিবর্তন করতে এটি সম্পাদনা mkdirমধ্যে cd

ধন্যবাদ! Esc। আমার কাছে সবচেয়ে সুবিধাজনক বলে মনে হচ্ছে, কী সিকোয়েন্সটির কোনও বিশেষ অর্থ আছে?
পদ্ধতিটি

"পূর্ববর্তী কমান্ডের শেষ শব্দটির পুনরাবৃত্তি" এর জন্য এটি কেবল বাশ (এবং উত্তরাধিকার সূত্রে প্রাপ্ত ksh, এবং এতেও কাজ করে zsh) ence আমি এটি প্রায়শই ব্যবহার করি।
গাইকোসর

30
@ গিলস আমি ভাবতে শুরু করেছি যে "গিলস" অ্যাকাউন্টটি আসলে বিশেষজ্ঞদের একটি প্যানেল ভাগ করেছে। ;-)
কিথ

@ স্টাফেনচাজেলাস /a/b/..//আসলে কাজ করবে তবে তা নয় /a/b/../c। সংশোধন করা হয়েছে। আমি প্রশ্নটি ব্যাপক দর্শকদের কাছে রেখেছি।
গিলস

1
mkcd() { mkdir -p "$1" && cd "$1"; }zsh এ আমার সমস্যা মনে হচ্ছে না। mkdir -p /var/tmp/somewhere/else /tmp/here; cd /tmp/here; ln -s /var/tmp/somewhere/else mylink; mkdir -p mylink/../foo && cd mylink/../foo; pwd(সেটআপ এবং অন্তর্ভুক্ত) প্রদর্শনগুলি /tmp/here/fooযা যা তৈরি হয়েছিল (এবং আমি কী প্রত্যাশা রেখেছিলাম)। bashভ্রান্তভাবে তৈরি করে এবং এতে পরিবর্তন হয় /var/tmp/somewhere/foo
অ্যাডাম কাটজ

133

এটি আপনার প্রয়োজন এমন এক-লাইনার। অন্য কোনও কনফিগারেশন প্রয়োজন নেই:

mkdir longtitleproject && cd $_

$_ব্যাশ- এ চলকটি পূর্ববর্তী কমান্ডকে দেওয়া সর্বশেষ যুক্তি। এই ক্ষেত্রে, আপনি সদ্য তৈরি করা ডিরেক্টরিটির নাম। হিসাবে ব্যাখ্যা করা হয়েছে man bash:

_         At  shell  startup,  set to the absolute pathname used to invoke
          the shell or shell script being executed as passed in the  envi
          ronment  or  argument  list.   Subsequently, expands to the last
          argument to the previous command, after expansion.  Also set  to
          the  full  pathname  used  to  invoke  each command executed and
          placed in the environment exported to that command.  When check
          ing  mail,  this  parameter holds the name of the mail file cur
          rently being checked."$_" is the last argument of the previous command.

এর cd $_পরিবর্তে পূর্ববর্তী কমান্ডের শেষ যুক্তিটি পুনরুদ্ধার করতে ব্যবহার করুন cd !$কারণ শেল ইতিহাসেcd !$ পূর্ববর্তী কমান্ডের শেষ যুক্তি দেয় :

cd ~/
mkdir folder && cd !$

আপনি বাড়িতে শেষ (বা ~ /)

cd ~/
mkdir newfolder && cd $_

আপনি বাড়ির নীচে নিউফোল্ডার শেষ! (বা ~ / নতুনফোল্ডার)


23
কেন পৃথিবীতে এই এক গৃহীত উত্তর নয়
জেস্মিথ

1
@JSmyth আমি একমত, এই একটি এক-লাইনের নেটিভ শেল কার্যকারিতা ব্যবহার করে হয়
sming

আমি মনে করি ওপি দুটি কমান্ড ব্যবহার না করার চেষ্টা করছে। এই উত্তরটি (প্রায়) করণ হিসাবে বৈধ mkdir foo && cd foo, যা সহজ নয়।
জোসেমিগাল্লাস

7
ওপি এক মাছ ধরার নৌকা যে ডিরেক্টরির নাম পুনরাবৃত্তি প্রয়োজন হয় না চাওয়ার হয়, এবং এই হল
জেসুস Carrera

এটি হ'ল theতিহ্যবাহী ওয়ান-লাইনার আপনি উল্লেখ করছেন বা অন্যকে ডক্স / টিউটোরিয়ালে ব্যবহার করতে দেখেছেন। এখানে আসলে 3 নিখুঁত উত্তর আছে। এটি একটি, @ জোর্ডান-হ্যারিসের দ্বারা নির্বাচিত উত্তর। আপনার সেটআপ এবং পছন্দ উপর নির্ভর করে।
ওয়েড

30

এই আচরণটি লিপিবদ্ধ করার জন্য এটি আমার কাছে কখনও ঘটত না কারণ আমি নীচের দিকে ঘন্টার পর ঘন্টা প্রবেশ করি ...

$ mkdir someDirectory<ENTER>
$ cd !$

যেখানে বাশ সদয়ভাবে !$শেষ লাইনের শেষ শব্দের সাথে প্রতিস্থাপন করে; যেমন আপনি যে দীর্ঘ ডিরেক্টরি নামটি প্রবেশ করেছেন

তদুপরি, এইরকম পরিস্থিতিতে ফাইলের নাম সম্পূর্ণ হওয়া আপনার বন্ধু। আপনার নতুন ডিরেক্টরি যদি ফোল্ডারে একমাত্র ফাইল হয় তবে দ্রুত ডাবল TABআপনাকে নতুন ডিরেক্টরিটি পুনরায় প্রবেশ না করেই দেবে।

যদিও এটি দুর্দান্ত যে বাশ আপনাকে যেমন সাধারণ কাজগুলি স্ক্রিপ্ট করতে দেয় যেমন অন্যান্য উত্তরগুলি মনে করে আমি মনে করি যে কমান্ড লাইন সম্পাদনা বৈশিষ্ট্যগুলি বাশকে দেওয়া উচিত তা শেখা ভাল যা আপনি যখন অন্য কোনও মেশিনে কাজ করছেন তখন সিনট্যাকটিকটি মিস করছেন না learn আপনার কাস্টম স্ক্রিপ্টগুলি সরবরাহ করে এমন চিনি।


1
এর মতো সবচেয়ে গুরুত্বপূর্ণ বাশ কুইক সন্ধানের জন্য কি কোনও ভাল জায়গা আছে?
ডেমোকিকব্রি

@ dominicbri7 সাধারণত "ব্যাশ কমান্ড লাইন সম্পাদনা" একই Googling অধীনে আসে একটি শীর্ষ ফলে নিম্নলিখিত দেয় web.mit.edu/gnu/doc/html/features_7.html আরো নির্দিষ্টভাবে,! $ ওয়ার্ড designator একটি উদাহরণ দেখতে হয় GNU। org / সফটওয়্যার / ব্যাশ / ম্যানুয়াল / bashref.html # শব্দ-ডিজাইনার
রব

17

অনুযায়ী কি কাস্টমাইজেশন আপনি উত্পাদনশীলতা বৃদ্ধি করার জন্য আপনার শেল প্রোফাইলে করেছ? , আমি এটি এইভাবে করি:

# make a directory and cd to it
mcd()
{
    test -d "$1" || mkdir "$1" && cd "$1"
}

এর অর্থ এটি ডিরেক্টরিটি ইতিমধ্যে উপস্থিত থাকলে এটিও কাজ করে।


4
-pMkdir, বিকল্প ত্রুটি দমন হবে।
গ্লেন জ্যাকম্যান

1
এমসিডি একটি বিদ্যমান কমান্ড। যদিও আপনি সবেমাত্র একটি উদাহরণ দিয়েছেন, আমি নিজেই এটি ব্যবহার করেছি কারণ এটি এমকেসিডির চেয়ে কম চিঠি।
ধর্মিত

@ ধর্মিত শাহ: বিদ্যমান mcdকমান্ড কী? কোন প্যাকেজ বা প্রকল্প এই আদেশ দেয়?
মাইকেল

2
mtools এমসিডি কমান্ড সরবরাহ করে। এর ম্যান পেজটি বলছে "এমসিডি কমান্ডটি এমএস-ডস ডিস্কে এমটিউলস ওয়ার্কিং ডিরেক্টরি পরিবর্তন করতে ব্যবহৃত হয়।"
ধর্মিত

13

আপনি ওহ আমার Zsh ব্যবহার করেন তাহলে, একটি কমান্ড নামক নিতে যে ঠিক এই আছে। এটি দেখতে এমন কিছু লাগবে।

take myfolder

আমি আসলে এটি দুর্ঘটনাক্রমে খুঁজে পেয়েছি। আমি কেবল দেখেছি এবং এটি ওহ আমার জেড জিটি গিথহাব উইকি থেকে এই চিটসেটে তালিকাভুক্ত । এটি বেশ কার্যকর কমান্ড এবং দৃশ্যত নিজেকে তৈরি করা খুব সহজ।


1
আমি কখনই জানতাম না take:) পারফেক্ট! বিটিডাব্লু - ওহ মাই জেডএস এর সাথে আইটির্ম 2 এখানে আসলে 3 নিখুঁত উত্তর আছে। এটি একটি, @ জেসেস-কেরেরা দ্বারা, এবং নির্বাচিত উত্তর। আপনার সেটআপ এবং পছন্দ উপর নির্ভর করে।
ওয়েড

3

অথবা আপনি অন- x = longproject ; mkdir $x ; cd $xফ্লাইতে একটি ছোট পরিবর্তনশীল তৈরি করতে এবং এটি দুটিবার ব্যবহার করতে পারেন - যা আমি স্বীকার করি যে শেলসক্রিপ্ট ফাংশনটি ব্যবহার করার চেয়ে এখনও বেশি দীর্ঘ :)


0

এখানে একটি সামান্য বৈকল্পিক যা উল্লেখযোগ্য:

function mkdir() {
    local dir=$1
    command mkdir "$dir"  &&  cd "$dir"
}

এটি আপনার যুক্ত করুন ~/.bash_profileএবং আপনি তারপরে mkdirস্বাভাবিক হিসাবে ব্যবহার করতে পারবেন (একবার sourceএটি হয়ে গেলে ), এখন বাদে এটি স্ট্যান্ডার্ড mkdirকমান্ডের পরিবর্তে উপরের ফাংশনটি পরিচালনা করবে ।

দ্রষ্টব্য, এটি গিলস কর্তৃক গৃহীত উত্তর অনুসারে ইনপুটকে বৈধতা দেয় না , তবে আপনি কীভাবে বিল্টিনগুলি (কার্যকরভাবে) ওভাররাইড করতে পারেন তা প্রদর্শন করে।

দস্তাবেজগুলি থেকে (সামান্য প্যারাফ্রেসিং করা):

command mkdir [args]রান mkdirদিয়ে argsনামে কোনো শেল ফাংশন উপেক্ষা mkdir। PATH অনুসন্ধান করে পাওয়া কেবল শেল বিল্টিন কমান্ড বা আদেশগুলি কার্যকর করা হয়। যদি কোনও শেল ফাংশন নামকরণ করা থাকে তবে ফাংশনটির মধ্যে lsচলমান ফাংশনটিকে পুনরাবৃত্তভাবে কল করার পরিবর্তে command lsবাহ্যিক কমান্ড কার্যকর করবেls

আমি বিশ্বাস করি এর সাথে builtinএকই রকম ফলাফল পাওয়া যায় command


আপনার অবশ্যই উদ্ধৃতি দেওয়া উচিত$dir
জেফ শ্যাচলার

@ জেফ, সম্মত, তবে স্বীকৃত উত্তরের যাবতীয় বৈধতার প্রয়োজন হবে। আমি কেবল commandবিকল্প হিসাবে ব্যবহার উপস্থাপন করছি ।
আরজ

0

বেস, জেডএসএইচ বা কেএসএইচে সহায়ক ফাংশন যুক্ত করা হচ্ছে

mkcdআপনার পরিবেশে এক লাইনে কমান্ড তৈরি করুন

echo -e 'mkcd() {\n mkdir -p "$1" && cd $_\n}' >> ~/.${0//-/}rc && . ~/.${0//-/}rc

-1

আমি একটি স্ক্রিপ্ট তৈরি করেছি যা ডিরেক্টরিটি তৈরি করে এবং তারপরে সিডি এর, তখন আমি এটি একটি উপাধি দিয়েছি। এবং এখানে একটি সংক্ষিপ্ত বিবরণ যেখানে আমি এটি বর্ণনা করছি।

https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be


-1

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

fun='
mkcd ()
{
    mkdir -p -- "$1" && cd -P -- "$1"
}'

echo "$fun" >> ~/.bashrc

mkcd.shএটি কেবল একটি নতুন ফাইলে অনুলিপি করুন এবং একবারে টার্মিনালে একবার চালান bash mkcd.sh। তারপরে source ~/.bashrcএটি বর্তমান সেশনে কাজ করার জন্য নির্বাহ করুন।

এর পরে, আপনি mkcd some_dirতৈরি করতে এবং সরাসরি সেই ডিরেক্টরিতে প্রবেশ করতে ব্যবহার করতে পারেন ।


আপনি কোনও স্ক্রিপ্ট (কোনও ফাইলে) লেখার পরামর্শ দিচ্ছেন যার একমাত্র উদ্দেশ্য ~/.bashrcফাইলটিতে যুক্ত করা (ইতিমধ্যে দেওয়া উত্তর দিয়ে)? এবং কীভাবে আপনি এই mkcd.shস্ক্রিপ্টটি তৈরির পরামর্শ দিচ্ছেন ? একটি সম্পাদক সহ, সম্ভবত? এটিকে কেবল সম্পাদনা করার চেয়ে আরও বেশি কাজ বলে মনে হচ্ছে ~/.bashrc। গৃহীত উত্তরের চেয়ে এর কী কী সুবিধা? ………………………………………………………………………………… পিএস এই সমস্যাগুলি উদ্ধৃত করার কারণে ব্যর্থ হবে, যা আমাকে নিজেও চেষ্টা করে দেখেনি বলে জানিয়েছে)।
স্কট

আমি দুঃখিত বলে মনে করি তবে হ্যাঁ আমি আমার উত্তরে যেমন লিখেছি আমি উপরের উত্তরগুলি ব্যবহার করেছি। এটা কাজ করে। আপনি যদি আমাকে বিশ্বাস না করেন, চেষ্টা করুন। এবং চেষ্টা না করার বিষয়ে, আমি আমার পুরো দিনটি ব্যাশ এবং অজগরগুলিতে এই জাতীয় স্ক্রিপ্টগুলি লেখার জন্য ব্যবহার করেছি।
subtleseeker

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