এক্সটেনশন পরিবর্তন করতে একাধিক ফাইলের নামকরণ এমভি দিয়ে


27

আমি কার্যকরভাবে কার্যকর করার জন্য সন্ধান করে তাদের এক্সটেনশন পরিবর্তন করতে ফাইলগুলির নাম পরিবর্তন করতে চাই

mv *.txt *.tsv

তবে এটি করার সময় আমি পাই:

* .tsv কোনও ডিরেক্টরি নয়

আমি এটি কিছুটা অদ্ভুত বলে মনে করি যে প্রথম 10 টি গুগল হিট শোতে এটির mvমতো কাজ করা উচিত।


আপনি কীভাবে এই ফাইলগুলির নাম পরিবর্তন করতে চান তা আপনাকে ব্যাখ্যা করা উচিত ।
টোটার

1
ঠিক আছে আমার কাছে * .গ্যাপডপিকের এক্সটেনশন সহ ফাইল রয়েছে এবং সেগুলি নাম * * বিবেড করতে চাই want এগুলি সবাই একই ডিরেক্টরিতে রয়েছে এটি খুব সহজ হওয়া উচিত তবে আমার সফল হওয়ার জন্য লুপের জন্য একটি পূর্ণ প্রয়োজন ছিল
Sander Van der Zeeuw

আপনি গুগলে যা পেয়েছেন তা আমার মনে হয় এমএসডোসের ক্ষেত্রে প্রযোজ্য।
টিকটক

@ দেবনুলের বিকল্প সমাধানটি সত্যিই সহায়ক
লুকাশভ ২

উত্তর:


22

আপনি যখন আদেশটি জারি করবেন:

mv *.txt *.tsv

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

আবার: শেলটি প্যাটার্নগুলি প্রসারিত করে, প্রোগ্রামটি নয়।


উদাহরণস্বরূপ লোডগুলি সম্ভবত সেরা উপায়, সুতরাং আমরা এখানে যাচ্ছি:

উদাহরণ 1:

$ ls
file1.txt file2.txt

$ mv *.txt *.tsv

এখন mvলাইনে যা ঘটে তা হ'ল শেলটি*.txt মেলানো ফাইলগুলিতে প্রসারিত হয়। যেহেতু এমন কোনও *.tsvফাইল নেই যা পরিবর্তন হয় নি।

mvকমান্ড বলা হয় দুটি বিশেষ আর্গুমেন্ট সহ :

  • argc: প্রোগ্রাম সহ যুক্তি সংখ্যা।
  • argv: প্রথম প্রবেশ হিসাবে প্রোগ্রাম সহ যুক্তিগুলির একটি অ্যারে।

উপরের উদাহরণে এটি হবে:

 argc = 4
 argv[0] = mv
 argv[1] = file1.txt
 argv[2] = file2.txt
 argv[3] = *.tsv

mvযদি শেষ যুক্তি, প্রোগ্রাম চেক দেখতে *.tsv, একটি ডিরেক্টরি। এটি যেমন নেই তেমন প্রোগ্রামটি চালিয়ে যেতে পারে না কারণ এটি ফাইলগুলিকে একত্রিত করার জন্য ডিজাইন করা হয়নি। (সাধারণত সমস্ত ফাইলকে একটিতে সরান)) বা ঝাপটায় ডিরেক্টরি তৈরি করবেন না।

ফলস্বরূপ এটি ত্রুটিটি বাতিল করে এবং রিপোর্ট করে:

mv: target ‘*.tsv’ is not a directory

উদাহরণ 2:

এখন আপনি যদি এর পরিবর্তে বলেন:

$ mv *1.txt *.tsv

mvআদেশের সঙ্গে মৃত্যুদন্ড কার্যকর করা হয়:

 argc = 3
 argv[0] = mv
 argv[1] = file1.txt
 argv[2] = *.tsv

এখন আবার উপস্থিত mvআছে কিনা তা পরীক্ষা করে দেখুন *.tsv। যেহেতু এটি ফাইলটি file1.txtসরানো হয় না *.tsv। তা হ'ল: ফাইলটির নাম পরিবর্তিত হয়েছে *.tsvতারকাচিহ্ন এবং সমস্ত দিয়ে।

$ mv *1.txt *.tsv
‘file1.txt’ -> ‘*.tsv’

$ ls
file2.txt *.tsv

উদাহরণ 3:

আপনি যদি এর পরিবর্তে বলেছিলেন:

$ mkdir *.tsv
$ mv *.txt *.tsv

mvআদেশের সঙ্গে মৃত্যুদন্ড কার্যকর করা হয়:

 argc = 3
 argv[0] = mv
 argv[1] = file1.txt
 argv[1] = file2.txt
 argv[2] = *.tsv

হিসাবে *.tsvএখন একটি ডিরেক্টরি হয়, ফাইল হচ্ছে প্রান্ত সেখানে চলে যান।


এখন: কমান্ড ব্যবহার করার মতো some_command *.tsvঅভিপ্রায়টি যখন আসলে ওয়াইল্ডকার্ডকে রাখে তখন সর্বদা তা উদ্ধৃত করা উচিত। উদ্ধৃতি দিয়ে আপনি যদি কোনও মিল থাকে তবে ওয়াইল্ডকার্ডগুলি প্রসারিত হতে বাধা দেন। যেমন mkdir "*.tsv"

উদাহরণ 4:

আপনি যদি উদাহরণস্বরূপ করেন তবে প্রসারণটি আরও দেখা যাবে:

$ ls
file1.txt file2.txt

$ mkdir *.txt
mkdir: cannot create directory ‘file1.txt’: File exists
mkdir: cannot create directory ‘file2.txt’: File exists

উদাহরণ 5:

এখন: mvকমান্ডটি একাধিক ফাইলে কাজ করতে পারে এবং করতে পারে। তবে সেখানে যদি আরও দুটি থাকে তবে সর্বশেষে একটি টার্গেট ডিরেক্টরি হতে হবে। (Ptionচ্ছিকভাবে আপনি -t TARGET_DIRবিকল্পটি ব্যবহার করতে পারেন , কমপক্ষে GNU mv এর জন্য))

সুতরাং এটি ঠিক আছে:

$ ls -F
b1.tsv  b2.tsv  f1.txt  f2.txt  f3.txt  foo/

$ mv *.txt *.tsv foo

এখানে কল করা mvহবে:

 argc = 7
 argv[0] = mv
 argv[1] = b1.tsv
 argv[2] = b2.tsv
 argv[3] = f1.txt
 argv[4] = f2.txt
 argv[5] = f3.txt
 argv[6] = foo

এবং সমস্ত ফাইল ডিরেক্টরিতে শেষ হয় foo


আপনার লিঙ্ক হিসাবে। আপনি একটি সরবরাহ করেছেন (একটি মন্তব্যে), যেখানে mvমোটেও উল্লেখ করা হয়নি, তবে rename। আপনার যদি আরও লিঙ্ক থাকে তবে আপনি ভাগ করতে পারেন। পাশাপাশি ম্যান পেজগুলির জন্য যেখানে আপনি দাবি করেন যে এটি প্রকাশ করা হয়েছে।


30

আমি জানি এটি আপনার প্রশ্নের উত্তর দেয় না, তবে আপনি যদি আপনার কাজের চারপাশের লুপের তুলনায় ফাইলগুলির নাম পরিবর্তন করার জন্য অন্য কোনও উপায় খুঁজছিলেন, তবে কেন ব্যবহার findকরবেন না ? আমি এই নির্দেশটি কয়েক হাজার ফাইল সহ বড় ডিরেক্টরিতে ফাইল এক্সটেনশনগুলি প্রতিস্থাপন করতে বহুবার ব্যবহার করেছি। এটি কোনও POSIX- আনুগত্যকারী সিস্টেমে কাজ করা উচিত:

find . -name "*.gappedPeak" -exec sh -c 'mv "$1" "${1%.gappedPeak}.bed"' _ {} \;

কমান্ড ব্রেকডাউন:

  1. ' .' => দ্বারা চিহ্নিত চিহ্নিত বর্তমান ডিরেক্টরিতে শুরু হওয়া অনুসন্ধানের পথ। '

  2. -name=> সন্ধানের মিলের নাম সেট করুন (এক্ষেত্রে সমস্ত ফাইল শেষ হয় .gappedPeak)

  3. -exec => প্রতিটি ম্যাচে নিম্নলিখিত কমান্ডটি কার্যকর করুন

  4. sh -c => 'এক্সিকিউট' প্রতিটি ম্যাচের জন্য একটি স্বাধীন শেল পরিবেশ তৈরি করে

  5. mv "$1" "${1%.gappedPeak}.bed"=> mvপ্রথম পরিবর্তনশীল ( $ 1 দ্বারা চিহ্নিত ), যা বর্তমান ফাইলের নাম, নতুন নামে। এখানে আমি একটি স্ট্রিং ম্যাচ করি এবং মুছুন; সুতরাং প্রথম বারটি নিন, $ 1 এবং স্ট্রিং থেকে %মুছতে ব্যবহার করুন .gappedPeak.bedশেষে শুধু অবশিষ্ট পরিবর্তনশীল, যা এখন শুধু concatenates সঙ্গে , নতুন তৈরি ফাইলের নাম।test#.bedtest#.bed

  6. আন্ডারস্কোরটি $ 0 এর জন্য একটি স্থানধারক

  7. {}প্রতিটি (দ্বারা প্রতিস্থাপিত হয় *.gappedPeak) ফাইলের নাম পাওয়া findকমান্ড, এবং হয়ে $ 1 থেকে shকমান্ড।

  8. \;-execকমান্ডের শেষ চিহ্নিত করে । আপনি ব্যবহার করতে পারেন ';'বা ";"

উদাহরণ:

[user@before]# ls -lh
total 0
-rw-r--r--. 1 root root 0 Jan 26 11:40 test1.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test2.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test3.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test4.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test5.gappedPeak

[user@after]# ls -lh
total 0
-rw-r--r--. 1 root root 0 Jan 26 11:40 test1.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test2.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test3.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test4.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test5.bed

আপনি প্রতিটি অংশ কি করে তা বর্ণনা করে কমান্ডটি দিয়ে যেতে পারেন?
ব্যবহারকারী 1717828

আমি এর জন্য দুঃখিত, আমি আমার পোস্ট আপডেট করেছি। আশা করি এইটি কাজ করবে.
ডিভনুল

1
অান্তরিক ধন্যবাদ! একটি সঙ্গে ব্যাশ নির্দেশিকা এবং আপনার ব্যাখ্যা আমি সবকিছু পেতে সক্ষম হন।
ব্যবহারকারী 1717828

সমস্যা নেই. খুশি এটা সাহায্য করে।
ডিভনুল

একটি যাদুমন্ত্র মত কাজ করে. একাধিক সাব ডায়ারগুলিতে file.abc-> এর জন্য এখানে আরও একটি সরলীকৃত উদাহরণ দেওয়া হয়েছে blub.xyz:find . -name "file.abc" -exec sh -c 'mv "$1" "$(dirname $1)/blub.xyz"' _ {} \;
মাহন

9

mv *.txt *.tsvকাজ করে না; mvএকসাথে কেবল একটি ফাইলের নাম পরিবর্তন করতে পারে। আপনি হয় ব্যাখ্যাগুলি ভুল বুঝেছেন বা সেগুলি ভুল।

mmvএবং renameএকবারে বেশ কয়েকটি ফাইলের নাম পরিবর্তন করতে পারে। তবে renameচারদিকে দুটি সংস্করণ রয়েছে যা আলাদাভাবে বলা হয়। এখানে সে সম্পর্কে প্রচুর প্রশ্ন থাকা উচিত।


1
cyberciti.biz/tips/… গুগলে প্রথম হিট বলছে যে এমভিও কাজ করতে হবে পাশাপাশি এটি কেন আমাকে এত অদ্ভুত মনে হয়েছে
স্যান্ডার ভ্যান ডের জিউউ

3
@ সান্দারভান্ডারজিউ আপনি সেখানে কী পড়ছেন তা আমি জানি না। উদাহরণগুলি ব্যবহার করে rename, না mv
হউক লেগেইং ২

1
দুঃখিত আমি ভুল এইচটিএমএল পেস্ট করেছি। এটিই ছিল udemy.com/blog/rename-a-file-in-linux
Sander Van der Zeeuw

3
পুনঃটুইট এই লোকেরা কোর্স দেয়? দুর্ভাগ্যক্রমে আমি সেখানে কোনও যোগাযোগের সম্ভাবনা দেখছি না। এটি কার্যকর হয় কিনা তা আপনি সহজেই পরীক্ষা করতে পারেন। তবে mv *.txt *.tsv mvইনগুলি (সাধারণত) শেল-প্রসারিত ফাইলের নামগুলি দেখতে *.txtবা না দেখায় *.tsv। এই ওয়াইল্ডকার্ডগুলি যে ফাইলগুলির আকারে প্রসারিত করবে সেগুলি "এলোমেলো" হবে। এই পরিস্থিতিতে কাজ করে এমন একমাত্র পরিস্থিতিটি যদি নামের সাথে কোনও ফাইল থাকে *.txtযা নামকরণ করা হবে (আক্ষরিকভাবে) *.tsv(উদ্ধৃতি না দিয়ে bashবিকল্পটি nullglobসেট করা উচিত নয়)।
হউক লেগেইন

1
বা তার থেকেও খারাপ. এক থাকে তাহলে এক ফাইল নামে যেমন foo.txtএবং এক নামে বিদ্যমান ওভাররাইট করবে ফাইল ...baz.tsvmv *.txt *.tsv.tsv
Runium

4

উদাহরণস্বরূপ, কমান্ডটি চালানোর সময় আপনার যদি ডিরেক্টরিতে asd.txtএবং qwe.txtফাইলগুলিতে থাকে তবে mv *.txt *.tsvএটি এই দুটি ফাইলকে নামের একটি ডিরেক্টরিতে স্থানান্তরিত করার চেষ্টা করে *.tsv। কারণ এখানে কোনও ডিরেক্টরি নেই, এটি একটি ত্রুটি দেয়।


ধন্যবাদ, এটি আংশিকভাবে স্পষ্ট করে। তবুও আমি এটি আশ্চর্যজনক মনে করি যে আমি অনেকগুলি ম্যানুয়াল পৃষ্ঠাগুলি দেখতে পাই যেখানে তারা দাবি করে যে এমভি একাধিকের জন্য কাজ করা উচিত।
স্যান্ডার ভ্যান ডের জিউউ

2

rename(1)

renameপার্লের নির্মাতা ল্যারি ওয়াল দ্বারা পরিচালিত পার্ল স্ক্রিপ্ট। এটি একটি পার্ল রেজেেক্স নেয় এবং ফাইলের নামে চালিত হয়।

rename 's/\.txt$/.tsv/' *.txt

স্থাপন

Debian / Ubuntu-

আপনার যদি renameডেবিয়ান / উবুন্টুতে ইনস্টল করতে হয় তবে আপনি এটি করতে পারেন

sudo apt install rename

0

বিবেচনা করার জন্য অন্য বিকল্পটি হ'ল:

cp -p *.txt *.tsv
rm -f *.txt
  • পতাকাটি ব্যবহার করে তাদের বৈশিষ্ট্যগুলি সংরক্ষণ *.txtকরার জন্য প্রথম লাইন সমস্ত ফাইল অনুলিপি *.tsvকরে -p
  • দ্বিতীয় লাইনটি প্যাটার্ন সহ সমস্ত ফাইল সরিয়ে দেয় *.txt
  • এই পদ্ধতির জন্য আপনার উত্স এবং লক্ষ্য ফাইলগুলি অস্থায়ীভাবে ধরে রাখতে পর্যাপ্ত ডিস্কের স্থান থাকা দরকার
  • এই পদ্ধতিটি ধীরে ধীরে mvযার চেয়ে ভিন্ন ভিন্ন পার্টিশনে না থাকলে কেবল ফাইলগুলি না সরানো / ডিরেক্টরি / ফাইলের নাম পরিবর্তন করে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.