ফোল্ডারের পাথটি পুনরাবৃত্তি না করে আমি কীভাবে অন্য ফোল্ডারে কমান্ড করব?


73

কপি ও অপারেশন করার কোনও চতুর উপায় বা কোনও ফোল্ডার নকল করার জন্য একটি আদেশ, কোনও কাজ না করে cd, পরে mvএকই ফোল্ডারে রয়েছে?

উদাহরণস্বরূপ, আমাকে নিম্নলিখিতগুলি চালাতে হবে:

mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt

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


9
আমি বিশ্বাস করতে পারি না এটির এতগুলি উত্সাহ রয়েছে। এটি একটি সদৃশ ইউনিক্স.স্ট্যাকেক্সেঞ্জাও.কম / সেকশনস
35782

13
@ ব্যবহারকারী 13107 বিভিন্ন শব্দ যুক্ত সহ একটি প্রশ্ন জিজ্ঞাসার অনেক উপায় রয়েছে। এবং যদি আপনি না জানেন যে উত্তরটিকে "ব্রেস প্রসার" বলা হয় তবে আপনি এখনই এটি খুঁজে পেতে সক্ষম নন।
slhck

2
@ ব্যবহারকারী 13107 তারা অন্য কোনও সাইটে রয়েছে তাই সদৃশ নয়
ব্যবহারকারী 151019

1
চিহ্নিত করুন, ধন্যবাদ, আমি নকল সম্পর্কে সেই নিয়মটি জানতাম না। @ স্লহ্যাক হ্যাঁ আমি বুঝেছি. আমি কেবল হতাশ হয়েছি কারণ আমার ইউনিক্স.এসই প্রশ্নটি নকল হিসাবে বন্ধ হয়ে গেছে এবং এইটি এত জনপ্রিয় হয়েছিল।
ব্যবহারকারী 13107

3
@ ব্যবহারকারী ১৩১০7, আপনি সঠিক সাইটে পোস্ট করার জন্য যা পান
স্যামুয়েল এডউইন ওয়ার্ড

উত্তর:


125

কেবল ব্রেস সম্প্রসারণ ব্যবহার করুন :

mv /folder1/folder2/folder3/{file.txt,file-2013.txt}

এটি লেখার সমতুল্য:

mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt

বন্ধনী সম্প্রসারণ আপনাকে অবশ্যই আরও যুক্তি সরবরাহ করতে দেয়। এমনকি আপনি, এটা রেঞ্জের পাস করতে পারেন যেমন পরীক্ষা ফোল্ডার দুয়েক তৈরি করতে আপনি চালাতে পারেন mkdir test_{a..z}, এবং ব্যাশ 4 দিয়ে শুরু, আপনি শূন্য প্যাডেড সিকোয়েন্স পাশাপাশি তৈরি, হিসাবে করতে touch foo{0001..3}, যা তৈরি করে foo0001, foo0002এবং foo0003ব্যাশ হ্যাকাররা উইকি তোমার জন্য উদাহরণ একটি দম্পতি সঙ্গে একটি নিবন্ধ আছে।

আপনার যদি দুটি পৃথক কমান্ড ব্যবহার করতে হয় তবে @ ইগনাসিওর উত্তর অনুসারেcd প্রথমে একটি সাব-শেল ব্যবহার করুন ।


5
আমি braceপ্রসারণ সম্পর্কে জানতাম না , ধন্যবাদ!
ভ্যালটার সিলভা

আমি চেষ্টা করেছি এবং এটি কাজ করছে না বলে মনে হচ্ছে:meniac ~: mv /tmp/f1/f2/f3/f4/f5/f6/{file.txt, file2.txt} mv: cannot stat ``/tmp/f1/f2/f3/f4/f5/f6/{file.txt,': No such file or directory
ভালটার সিলভা

5
আপনি কি নিশ্চিত যে আপনি বাশকে ব্যবহার করছেন /bin/bash, এবং আপনি কোনও স্ক্রিপ্টে নেই যা /bin/shশেবাং বা অন্য কোনও শেল রয়েছে যা ব্রেস প্রসারণ সমর্থন করে না? আপনি চালাতে পারেন set, আপনার কি SHELLOPTSধারণ braceexpand?
slhck

22
মনে রাখবেন যে file.txt,এবং এর মধ্যে কোনও স্থান থাকতে হবে না file2.txt
slhck

9
যে অংশটি পরিবর্তিত হয় না এমন অংশে টাইপগুলি রোধ করতে আপনি এটিকে আরও খাটো করে তুলতে পারেন:mv /folder1/folder2/folder3/file{,-2013}.txt
জান ফ্যাব্রি

74

একটি সাব শীলে অপারেশন চালান।

( cd /folder1/folder2/folder3 && mv file.txt file-2013.txt )

ওয়ার্কিং ডিরেক্টরি পরিবর্তনের জন্য প্যারেন্ট শেলটিতে প্রচার করা হবে না।


11
+1: আমি এইটিকে পছন্দ করি, ব্রেস-এক্সপেনশন ট্রিকের চেয়ে শেলগুলি জুড়ে বেশি পোর্টেবল (যা ঝরঝরে, তবে কম পোর্টেবল)
অলিভিয়ার ডুলাক

@ অলিভিয়ার, আপনার মনে হয় ব্রেস সম্প্রসারণ বহনযোগ্য নয়? আপনার মনে কোন শেলটি এটি সমর্থন করে না?
অ্যালেক্সিস

5
@alexis ব্রেস প্রসারণ POSIX দ্বারা নির্দিষ্ট করা হয়নি তাই "ডিজাইনের মাধ্যমে" বহনযোগ্য নয়। ash, dash, ksh88না বৃদ্ধ বোর্ন শেল এটা সমর্থন না শাঁস উদাহরণ উল্লেখ করা হয়।
jlliagre

@ jlliagre আপনি উল্লিখিত শেলগুলির মধ্যে কোনটি পুরোপুরি POSIX অনুসারে রয়েছে? তার মানে তারা পসিক্স হলেও তাদের ব্রেস সম্প্রসারণ করবে না। POSIX অনুমোদনের আগে ksh88 ছিল; আপনার কমপক্ষে ksh93 এ আপগ্রেড করা উচিত। লিনাক্সের কেবলমাত্র দু'জনই অ্যাশ এবং ড্যাশ বিবেচনা করবে কারণ তারা কিছু ছোট এম্বেডেড ডিস্ট্রো (ব্যস্তবক্স, আইরিক?) এবং রেসকিউ ডিস্কে ব্যবহৃত হয়।
কাজ

2
@ কাজ আমি শেল কমান্ডগুলির বহনযোগ্যতা এবং এগুলি ইন্টারেক্টিভ বা এগুলি গুরুত্বপূর্ণ নয় এর বিষয়টি যত্নশীল। অবশ্যই, আপনি অবশ্যই এ সম্পর্কে যত্ন নিতে নিঃসন্দেহে তবে দয়া করে মেনে নিন যে লোকেরা অন্যথায় চিন্তা করে। আপনি সর্বদা ব্যাশ বা শেল ব্যবহার করেন যা বার্সি-প্রসারণকে সমর্থন করে তার অর্থ এই নয় যে এটি সবার ক্ষেত্রে।
jlliagre

21

আপনি যদি চালাক চান, এখানে বাশ ইতিহাসের সম্প্রসারণ

mv /folder1/folder2/folder3/file.txt !#:1:h/file-2013.txt

মুখস্থ করা অসম্ভব বলে আমি এটি নিজে ব্যবহার করব না। আমি মাঝে মাঝে ভিম সমতুল্য ব্যবহার করি তবে প্রায় প্রতিবারই এটি সন্ধান করতে হয়।


11

আপনি একটি পরিবর্তনশীল সেট করতে পারেন। অবশ্যই এর পার্শ্ব-প্রতিক্রিয়াটি প্রায় ভেরিয়েবলগুলি রেখে যাওয়ার রয়েছে।

D=/folder1/folder2/folder3; mv $D/file.txt $D/file-2013.txt

এবং অবশ্যই, আপনি পুরো কমান্ড লাইনটি সাবসেলের মধ্যে রেখে (D="/folder1/folder2/folder3"; mv "$D"/file.txt "$D"/file-2013.txt), বা কেবল unsetশেষে একটি কমান্ড যুক্ত করে ভেরিয়েবল (গুলি) ছেড়ে দেওয়ার পার্শ্ব-প্রতিক্রিয়া এড়াতে পারেন । (আমি একটি "সর্বোত্তম অনুশীলন" হিসাবে উক্তিগুলি যোগ করেছি; যদি আপনি সর্বদা উক্তি ব্যবহারের অভ্যাস পান তবে বিশেষ অক্ষরযুক্ত কোনও পথের নামটি উপস্থিত হলে আপনাকে থামাতে হবে এবং আপনার মাথাটি আঁচড়তে হবে না))
স্কট

@ স্কট আপনি যদি পার্শ্ব-প্রতিক্রিয়াগুলি দূর করতে সাবসেল ব্যবহার করতে চলেছেন তবে cdভেরিয়েবল সেট করার চেয়ে এটি করা আরও সহজ । নেই একটি অনেক সহজ, আমি স্বীকার।
আইজাক রবিনোভিচ

2

আমি অন্যান্য সমাধানগুলি পছন্দ করি তবে এখানে আরও একটি, ব্যাশ অ্যারে, পুশড, পপড সহ স্ক্রিপ্ট হিসাবে প্রয়োগ করা হয়েছে:

#!/bin/bash
set -e
# from http://stackoverflow.com/a/246128/178651
script_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# paths relative to the script
relative_paths=( \
path1 \
path2 \
path3 \
path4
)

for relative_path in "${relative_paths[@]}"
do
  pushd "$script_path/$relative_path" > /dev/null 2>&1
  pwd
  mv filename1 filename2
  # could do other stuff in this directory...
  popd > /dev/null 2>&1
done

pushd "$script_path" > /dev/null 2>&1
# could do other stuff in same directory as script...
popd > /dev/null 2>&1

1

স্লিহ্যাক সরাসরি সহজতম পদ্ধতিতে প্রশ্নের উত্তর দেয়, তবে ভালটারও অটোপপ উত্তর পছন্দ করে, তাই এখানে একই লাইনের সাথে একটি;

pushd /folder1/folder2/folder3/; mv file.txt file-2013.txt; popd
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.