লম্বা নামের লিনাক্স এমভি ফাইল


19

লিনাক্সে আমি মাঝে মাঝে এই জাতীয় ফাইলগুলির নাম পরিবর্তন করি:

mv dir1/dir2/dir3/file.txt  dir1/dir2/dir3/file.txt.old

নোট করুন যে আমি কেবল ফাইলটির নাম পরিবর্তন করতে চাই, এটি অন্য ডিরেক্টরিতে সরাতে চাই না।

এমন কোন আদেশ আছে যা আমাকে সেই আদেশের শর্টহ্যান্ড সংস্করণ করতে দেয়? আমি এমন কিছু ভাবছি:

mv dir1/dir2/dir3/file.txt  file.txt.old

অথবা হতে পারে এমন কিছু (কেবল নামের সাথে সংযুক্ত করতে):

mv dir1/dir2/dir3/file.txt  {}.old

আমার লক্ষ্যটি আবার পুরো পথটি নির্দিষ্ট করতে হবে না।

আমি জানি যে "উদাহরণগুলি" আমি লিখেছি তা কার্যকর হয় না, তবে আমি কী অর্জন করতে চাই তা কেবল এটি একটি ধারণা।

আমি ডিরেক্টরিতে সিডি করতে চাই না।


8
আপনি কেন ডিরেক্টরিতে পরিবর্তন করবেন না? এটি দ্রুত এবং আপনার সমস্যা সমাধান করে।
মাইকেল হ্যাম্পটন

আমি এই একই অবস্থান থেকে অনেক সাব-ডাইরেক্টরিকে নিয়ে কাজ করছি, যদি প্রতিবারই এই পিতামাতার কাছে ফিরে আসতে হয় তবে এটি ধীর
সান্তিয়াগো আরিজিটি

3
কেউ আপনাকে বলেনি যে আপনি অন্য কোনও ডিরেক্টরিতে পরিবর্তন করতে পারেন, কেবলমাত্র আপনি চান।
মাইকেল হ্যাম্পটন

নোট যে (cd dir1/dir2/dir3 && exec mv file.txt{,.old})সাব-প্রসেস ছাড়াই কোডের মতো কার্যকরভাবে কার্যকর হয়েছে, কারণ বাহ্যিক কমান্ডের অনুরোধের সময় ইনগ্রেস করা থেকে execবিরত থাকে fork(), সুতরাং আপনার কোনওভাবেই কাঁটাচামচ রয়েছে।
চার্লস ডফি

উত্তর:


45

একটি ফাইল চেষ্টা করে দেখুন

mv dir1/dir2/dir3/file.{txt,txt.old}

যেখানে X{a,b}কনস্ট্রাক্ট প্রসারিত হয় Xa Xb, আপনি ব্যবহার করে একটি পূর্বরূপ পেতে পারেন

echo dir1/dir2/dir3/file.{txt,txt.old}

এটি আপনার প্রয়োজনের সাথে খাপ খায় কিনা তা দেখতে।

বিঃদ্রঃ:

  1. একাধিক ফাইলের জন্য

    mv dir1/dir2/dir3/file{1,2,3}.{txt,txt.old}
    

আপনি যা চান তা প্রসারিত হওয়ার সম্ভাবনা কম। (এটি file.txt file1.txt.old file2.txt এর মিশ্রিত আকারে প্রসারিত হবে ...)

  1. {txt,txt.old}{,.old}মন্তব্য অনুযায়ী সংক্ষিপ্ত করা যেতে পারে

  2. যদি ডিরেক্টরিটির নামটি দ্ব্যর্থহীন হয় তবে ওয়াইল্ডকার্ড ব্যবহার করা যেতে পারে।

    mv *1/*2/d*/*.{,old}
    

একাধিক ফাইল ব্যবহারের জন্য rename

rename -n s/txt/old.txt/ dir1/dir2/dir3/file*.txt 

-nকার্যকর নাম পরিবর্তন করতে ড্রপ ।


1
সুন্দর, আমি প্রসারণের এই উপায়টি জানতাম না! আপনাকে ধন্যবাদ
সান্টিয়াগো আরিজতি

14
mv dir1/dir2/dir3/file.txt{,.old}কাজ করবে না, এবং আরও খাটো হবে?
জোশ

3
@ জোস হ্যাঁ এটি নিখুঁতভাবে কাজ করে এবং কম কীস্ট্রোক প্রয়োজন। আমি এই নির্মাণটি খুব নিয়মিত ব্যবহার করি।
আরএলএফ

2
এটি মজার বিষয় যে আপনি কীভাবে বছরের পর বছর লিনাক্স শেলটি ব্যবহার করতে পারেন এবং এখনও সর্বদা নতুন কৌশলগুলি সন্ধান করতে পারেন
সান্তিয়াগো আরিজিটি

আমি অনুমান করি যে এই সমস্ত "কৌশলগুলি" আরও স্পষ্ট হবে যদি আমি বাশ ভাষায় কিছু আনুষ্ঠানিক প্রশিক্ষণ গ্রহণ করি তবে আমি কেবল এটির জন্য যথেষ্ট শিখছি।
সান্টিয়াগো আরিজিটি

6

কমান্ডটি renameসমস্ত মিলে যাওয়া ফাইলগুলির নাম পরিবর্তন করে। এর মূল উদ্দেশ্য একাধিক ফাইলের নাম পরিবর্তন করা, তবে পার্ল এক্সপ্রেশনটি যদি কেবল একটি ফাইলের সাথে মিলে যায় তবে এটি কেবল এই একক ফাইলটির নাম পরিবর্তন করবে। বিবরণ এবং ডিস্ট্রো নির্দিষ্ট সিনট্যাক্স জন্য দয়া করে র manpage পড়ুন: man rename

ব্যবহারের উদাহরণ: "/path/file.txt.old" থেকে "/path/file.txt" নাম পরিবর্তন করুন:

rename 's/file.txt/file.txt.old/g' /path/file.txt

সংক্ষিপ্ত স্বরলিপি (শালম্বকে ধন্যবাদ):

rename 's/$/.old/' /path/file.txt
rename '$_.=".old"' /path/file.txt

একটি শুকনো রান ব্যবহারের জন্য rename -n

আরও উদাহরণ এবং বিশদ https://thepcspy.com/read/bulk-rename-files-in-ubuntu/ এ পাওয়া যাবে


শীতল, আমি পুনর্নবীকরণ কমান্ড সম্পর্কে জানতাম, এটি যা করতে পারে তা কেবল কখনই জানত না, আপনাকে ধন্যবাদ!
সান্টিয়াগো আরিজিটি

6
দুর্ভাগ্যক্রমে বিভিন্ন লিনাক্স ডিস্ট্রিবিউশনের renameসম্পূর্ণ ভিন্ন আচরণের সাথে বিভিন্ন কমান্ড রয়েছে।
ক্যাস্পারড

1
সংযোজন করে পুনঃনামকরনের এর এই বিশেষ কাজের জন্য .oldফাইলের নাম, এটা সম্ভবত একটি কি একটি বিট আরো সুবিধাজনক rename 's/$/.old/' /path/to/file.txtবাrename '$_.=".old"' /path/to/file.txt
shalomb

@ ফ্যাবিয়ান - আমি নীটপিকিং করছিলাম না, প্রায়শই ব্যবহৃত আইডিয়ম যেটি ওপি খুঁজছিল বলে মনে হচ্ছে তার জন্য কেবল "সবচেয়ে সংক্ষিপ্ত হাত" খুঁজছিলাম :)
শালম্ব

4

একতরফা মামলার জন্য, আমি যদি আমার বর্তমান ডিরেক্টরিটি পরিবর্তন করতে না চাই তবে আমি কেবল একটি সাব-শেল ব্যবহার করতে পারি:

(cd dir1/dir2/dir3/ && mv file.txt file.txt.old)

আপনি cdসাব-শেলের অভ্যন্তরে থাকায় আপনি নিজের ডিরেক্টরিটি প্রকৃত শেলটিতে পরিবর্তন করেন নি


4
দ্রুততর এবং ব্যবহার করা নিরাপদ && exec mv- এইভাবে আপনি যদি cdব্যর্থ হয় তবে নাম পরিবর্তন করার চেষ্টা করবেন না এবং execএইভাবে কর্মক্ষমতা জরিমানা এড়িয়ে সাবসেল গ্রাস করে।
চার্লস ডফি

&& এক-মামলার মামলার সাথে একমত হোন , যেমনটি আমি বলেছিলাম, আমি সাব-শেলটির ব্যয় সম্পর্কে চিন্তা করব না (এটি সহজ রাখুন: কীভাবে এটি করা যায় তা সহজেই স্মরণ করতে সক্ষম হওয়া আরও গুরুত্বপূর্ণ আইএমও)
অ্যাডাম

আমি তর্ক করা চাই আপনি শুধুমাত্র একটি উপায় মনে রাখার জন্য, কার্যকর উপায় স্মরণ চলুন যদি সাহায্য করে নিশ্চিত করুন যে আপনি ক্ষেত্রেই অদক্ষ রুট যেখানে এটি যেতে না করতে না ব্যাপার।
চার্লস ডাফি

4

আমি @ archemar এর}} সম্প্রসারণের সমাধানটি পছন্দ করি, কারণ আপনি যখনই ইতিমধ্যে আপনার কমান্ড লাইন শুরু করেছিলেন তখন আপনি এটি ব্যবহার করতে পারেন। সম্পূর্ণতার জন্য এখানে আরও কিছু সম্ভাবনা রয়েছে:

F="dir1/dir2/dir3/file.txt" ; mv "$F" "$F.old"

(উদ্ধৃতিগুলি কেবলমাত্র তখনই প্রয়োজনীয় যখন আপনার কাছে নামে ফাঁকা স্থান বা অন্য শব্দ ভাঙার অক্ষর রয়েছে)

mymv() {
    mv "$1/$2" "$1/$3"
}

mymv dir1/dir2/dir3 file.txt file.txt.old
mymv dir5/dir6/dir7 file.txt file.txt.old

মন্তব্য:

  • এটি বাশ সিনট্যাক্স, আপনি অন্য শেল ব্যবহার করতে পারেন
  • mymv যে কোনও যুক্তিসঙ্গত স্ট্রিং হতে পারে, আমি "আমার পদক্ষেপ" এর জন্য mymv ব্যবহার করেছি।
  • ফাংশন সংজ্ঞাটি আপনার .Bash_ প্রোফাইলে রাখা যেতে পারে

আরেকটা:

cd dir1/dir2/dir3 ; mv file.txt file.txt.old ; cd -

কিন্তু

(cd dir1/dir2/dir3/ && exec mv file.txt file.txt.old)

(@ অ্যাডাম এবং @ চার্লসডুফি থেকে) সিডি ব্যর্থ হওয়ার ক্ষেত্রে যুক্তিযুক্তভাবে ভাল।


1
ব্যবহার করবেন না mmv, ইতিমধ্যে এই নামে একটি প্রোগ্রাম রয়েছে।
glglgl

1
@glglgl সম্পন্ন হয়েছে :)
Law29

2

mvকমান্ডটি সংক্ষিপ্ত করার জন্য আপনি যদি উপ-ডিরেক্টরিতে প্রবেশ করতে চান তবে বর্তমান ডিরেক্টরিতে আবার আসতে চান, এটি করার দুটি উপায় আছে। এক করা হয় cdএবং mvএকটি subshell মধ্যে (যেমন ইতিমধ্যে বলা হয়েছে)।

অন্যটি হ'ল ডিরেক্টরিগুলি ব্যবহার pushdএবং popdপরিবর্তন করা:

pushd dir1/dir2/dir3/; mv file.txt file.txt.old; popd

pushdকমান্ড মত হল cdব্যতীত এটি প্রথম একটি স্ট্যাক সম্মুখের বর্তমান ডিরেক্টরীর নাম পাহাড় জমে। popdস্ট্যাক থেকে শীর্ষ নামটি সরিয়ে দেয় এবং ডিরেক্টরিতে পরিবর্তিত হয়।


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

2

আমি শুধু করতাম

cd dir1/dir2/dir3/
mv file.txt file.txt.old
cd ~- # go to the most recent directory

0

জড়িত সমাধান: mv something{.txt,.txt.old}একটি "বাশিজম" ব্যবহার করা হচ্ছে। সাধারণ ভেরিয়েবল ম্যানিপুলেশনগুলি ব্যবহার করে যদি আপনি আরও বহনযোগ্য উপায় চান:

# rename all files "file*.txt" of directory /dir1/dir2/dir3 into file*.txt.old:
for f in dir1/dir2/dir3/file*.txt ; do
  mv "$f" "${f/.txt/.txt.old}"  # note there are no terminating "/"
done


# "${var/A/B}" is the content of var with the first occurence of "A" replaced by "B"

2
প্রাসঙ্গিক POSIX নির্দিষ্টকরণের জন্য pubs.opengroup.org/onlinepubs/009695399/utilities/… দেখুন - ${var/text/replacement}নিজেই বাশিজম।
চার্লস ডফি

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