কীভাবে ফাইন্ড কমান্ডটি ব্যবহার করে ফাইল নাম থেকে (1) সরিয়ে ফেলা যায়


13

আমি সম্প্রতি আমার ম্যাক ওএস 10.7 (সিংহ) এক্সএলডি ব্যবহার করে আমার সমস্ত এফএলসি ফাইলগুলিকে 44.1 কেএইচজেডের নিম্ন স্যাম্পলিং হার এবং 24 বিটের বিট গভীরতায় রূপান্তর করেছি (কারণ আইফোন / আইপড এর উপরে কিছু সমর্থন করে না)।

যদিও আমি পূর্বের সমস্ত ফাইল ওভাররোট করতে এক্সএলডিকে বলেছি, এক্সএলডি (1)খুব পছন্দ মতো ফাইলের শেষে একটি যুক্ত করেছে

some_song.m4a

প্রতি

some_song(1).m4a

সুতরাং এখন (1)আমি রূপান্তরিত সমস্ত FLAC ফাইল থেকে এটিকে সরাতে চাই ।

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

আমি জানি যে find . -name *\(1\).m4aরূপান্তরিত সমস্ত এফএলএসি ফাইল দখল করবে।

পরবর্তী আমি জানি যে আমাকে কিছু করতে হবে -execএবং mvসমস্ত পাওয়া ফাইলগুলির নতুন নামকরণ করতে হবে। তবে আমি বুঝতে পারি না যে কীভাবে আসল ফাইল নাম রাখা যায় এবং কেবলমাত্র এটি মুছে ফেলা যায় (1)

আমি যে ফাইল নামটি সংশোধন করতে চাই না সে অংশটি সংরক্ষণ করার জন্য আমার কিছু গ্রুপ রেজেক্স ক্যাপচারিং করতে হবে? অথবা সম্ভবত এক লাইনে সবকিছু করা সম্ভব নয় এবং আমার একটি শেল স্ক্রিপ্ট তৈরি করা উচিত (যা আমি এটি করতে আরামদায়ক নই, তবে আমি এটি চেষ্টা করে দেখতে চাই) a

কোন পরামর্শ বা পরামর্শ স্বাগত জানানো হয়! ধন্যবাদ!


5
ডাউনটা কেন? এটি একটি বৈধ প্রশ্নের মতো মনে হচ্ছে ...

আপনার নির্দিষ্ট প্রশ্নের সাথে সম্পর্কিত নয় ( findতবে) তবে এটি আপনার আসল সমস্যাটি সমাধান করতে পারে (অডিও ফাইলগুলিতে রূপান্তর করা), আপনি অডিওটুলস.সোর্সফোর্জন.নেট এবং এই উদাহরণের ক্ষেত্রে (ম্যাকোক্স সিংহের জন্য) invibe.net/
মেডুজ

উত্তর:


13

findএকটি শেষ রিসোর্ট হিসাবে ব্যতীত আউটপুট পার্স করার চেষ্টা করবেন না । এটি অনুধাবন করা গুরুত্বপূর্ণ যে ইউনিক্স ফাইল সিস্টেমে ফাইলের নামগুলি স্ট্রিং (একটি সাধারণ ভুল ধারণা) নয় বরং বাইনারি ব্লবগুলিতে কোনও শত্রু/ এবং নাল অক্ষর ব্যতীত যে কোনও অক্ষর থাকতে পারে । ফাইলের নাম পার্সিং নিরাপদে এবং সঠিকভাবে ব্যাথা সেই সময় 99% আপনি শুধু এটা পুরাপুরি করছেন এড়াতে চাইবেন বড়ই অভিমানী; (ঠিক কিভাবে লোমশ তাকান sedমত প্রকাশের @ yarek এর উত্তর নেই এবং এমনকি যে সব ক্ষেত্রে কাভার করে না) । ধন্যবাদ, এই ক্ষেত্রে একটি আরও সহজ পদ্ধতির আছে:

find . -name '*(1).m4a' -execdir sh -c \
'for arg; do mv "$arg" "${arg%(1).m4a}".m4a; done' _ {} \+

পরিচ্ছন্ন অভিব্যক্তি হিসাবে পরিষ্কার হিসাবে এখনও ঝরঝরে :) :) +1
ইয়র্ক

1
এখানে কিছু অনুপস্থিত ... কোথায় done?
ইয়ার্ক

@ ইয়্যারেক ধরার জন্য ধন্যবাদ এর মধ্যে sedপাইপ পদ্ধতির মধ্যে সবচেয়ে বড় পার্থক্যটি এটি অনেক বেশি নিরাপদ। রেগেক্স ব্যাকস্ল্যাশ স্যুপের চেয়ে পড়া আরও সহজ, আপনি যদি কিছু বেসিক শেল স্ক্রিপ্টিং নির্মাণ বোঝেন।
jw013

তুমি ঠিক বলছো; এটা অনেক পরিষ্কার। এবং $argভেরিয়েবল এটি পড়া সহজ করে তোলে।
hobbes3

1
@DQdlM দ্য snippet আমি উপরের পোস্ট শুধু findinvoking shমোটামুটি পোর্টেবল POSIX সিনট্যাক্স সঙ্গে। অধিক বিবরণের জন্য, আপনি চেক আউট করতে পারেন প্যারামিটার সম্প্রসারণ বিভাগে , যৌগ কমান্ড বিভাগে যে ব্যাখ্যা forলুপ , এবং POSIX findবৈশিষ্ট । এই সংস্থানগুলি ছাড়াও, আপনার যে কোনও নির্দিষ্ট প্রশ্নের উত্তর দিতে পেরে আমি আনন্দিত ।
jw013

6

ডেবিয়ান এবং উবুন্টুতে, আমি rename 's/\(1\)//' *.m4aআপনার সমস্যা সমাধানের জন্য ব্যবহার করতে পারি ।


অদ্ভুত, আমি করতে পারি man rename, তবে আমার আসলে নেই rename: -bash: rename: command not found( which renameকিছুই দেখায় না)।
হবিস 3

@ hobbes3 ম্যাক উপর এখানে man -a renameখুঁজে বের করে পুনঃনামকরণ প্রাপ্ত syscall, এবং - (2) পুনঃনামকরণ (ঢ) - TCL কমান্ড। সেখানে পুনরায় নামকরণ (1) বা ইউটিলিটি নিজেই নেই।
yrk

1
আইআইআরসি, renameএকটি পার্ল স্ক্রিপ্ট যা কিছু পার্ল ইনস্টলের অন্তর্ভুক্ত উদাহরণগুলির সাথে অন্তর্ভুক্ত থাকে এবং একটি দম্পতি ডিস্ট্রস এটিকে পথের মধ্যে অন্তর্ভুক্ত করে কারণ এটি একটি সুবিধাজনক কমান্ড। (@ হবিস সম্ভবত আপনি এটি ইন্টারনেটে খুঁজে পেতে পারেন)
কেভিন

আমার সিস্টেমে renameথাকা কেভিন স্বাভাবিক বাইনারি (পার্ল নয়)। তবে অন্য সাবধানতা হ'ল renameসমর্থন সংস্করণগুলির সমস্ত সংস্করণ নয় । উদাহরণস্বরূপ আমার কাছে থাকা সংস্করণটি কেবল আপনাকে সরাসরি স্ট্রিং প্রতিস্থাপন করতে দেয়, উদাহরণস্বরূপrename '(1)' '' *.m4a
প্যাট্রিক

1
পার্ল renameস্ক্রিপ্টটি কেবলমাত্র ডেবিয়ান এবং ডেরিভেটিভস দ্বারা ইনস্টল করা আছে। অন্যান্য লিনাক্স সিস্টেমের আলাদা renameইউটিলিটি রয়েছে (প্যাট্রিক দেখানো হয়েছে)। ওএসএক্সেরও নেই।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

4

Zsh এ , zmv ব্যবহার করে :

autoload zmv      # you can put this line in your .zshrc
zmv '(*)\(1\)(*)' '$1$2'

দ্বিতীয় যুক্তিতে (নতুন নাম), $1এবং উত্স প্যাটার্নে $2প্রথম বন্ধনী গোষ্ঠীগুলি পড়ুন (PATTERN)। এই নামকরণের লেখার আর একটি উপায়

zmv '(*)' '${1/\(1\)/}'

3

নিম্নলিখিত পদ্ধতির সাহায্যে উত্পাদিত কমান্ডগুলি সম্পাদন করার আগে তাদের পূর্বরূপ / ছাঁটাই করার ক্ষমতা দেয় এবং এটি অত্যন্ত বহনযোগ্য: এটি কেবল ম্যাকের জন্যই নয়, কেবল জিএনইউ সিডের সাথে নয়; এমনকি find(1) কমান্ড ব্যতীত সিস্টেমে কোনও duঝামেলা ছাড়াই (1) দিয়ে এটি প্রতিস্থাপন করা সম্ভব ।

find . -name '*(1).m4a' |
sed 's/\(.*\)(1).m4a$/mv & \1.m4a/' 

মুদ্রিত কমান্ডগুলির সাথে সন্তুষ্ট থাকলে | sh -xসংযোজন সহ পুনরায় চালনা করুন ।

যদি ফাইলটি নামে স্পেস নিয়ে উদ্বিগ্ন, অন্য যোগ গুলি সব শূণ্যস্থান অব্যাহতি:

find . -name '*(1).m4a' |
sed -e 's/ /\\ /g' -e 's/\(.*\)(1).m4a$/mv & \1.m4a/'

অন্যান্য বিশেষ অক্ষরগুলি যদি প্রত্যাশিত হয় তবে এটি কিছুটা জটিল হয়ে উঠবে:

find . -name '*(1).m4a' |
sed -e "s/'/'\\\\''/g" -e 's/\(.*\)(1).m4a$/mv '\''&'\'' '\''\1.m4a'\'/

প্রথম ফাংশন সমস্তকে 'এমন আকারে রূপান্তরিত করে যেগুলি যখন '...'অক্ষরযুক্ত স্ট্রিংয়ের মাঝখানে থাকে তখন এগুলি আক্ষরিক অর্থে নেওয়া হয় । দ্বিতীয়ত ফাংশন উত্পন্ন এমভি কমান্ড যার আর্গুমেন্ট মধ্যে সংযোজিত হল '...'


1
এই কমান্ডটি ফাইলের নাম (স্পেস (এবং অন্যান্য সমস্ত বিশেষ অক্ষর) এড়াচ্ছে না বা ফাইল নামের চারপাশে উদ্ধৃতি যোগ করছে না। আমি আপনার কমান্ডটি সংশোধন করার চেষ্টা করেছি, তবে mvকমান্ডের জন্য উভয় ফাইলের নামের চারপাশে কীভাবে উদ্ধৃতি যুক্ত করব তা আমি বুঝতে পারি না । আপনার কমান্ড থেকে প্রাপ্ত ফলাফলের একটি mv ./The Beatles - Let It Be (MFSL LP 1-109) 24-96 Vinyl Rip/01 Two Of Us(1).m4a ./The Beatles - Let It Be (MFSL LP 1-109) 24-96 Vinyl Rip/01 Two Of Us.m4a। এবং আমি যদি এই আদেশটি চালান আমি পেতে -bash: syntax error near unexpected token '('
হবিস 3

এটি একটি হোমওয়ার্ক বলে মনে করা হচ্ছে :) তবে ঠিক আছে, আমি উত্তরটি আপডেট করব
yrk

উপায় দ্বারা GNU সেড eপ্রতিস্থাপনের পরে কমান্ড যুক্ত করে কমান্ড নিজেই কার্যকর করতে পারে । উদাহরণস্বরূপ find . -name '*(1).m4a' | sed 's/\(.*\)(1).m4a$/mv & \1.m4a/e'পাইপ না করে কমান্ডকে ছাড়িয়ে যাবে sh -x
তাড়াতাড়ি

@ রাশ যে একমাত্র সেড যে এটি করে; এবং এটি (মনে করিয়ে দেয় যাহাই হউক না কেন শেল শুরু করার জন্য প্রয়োজন, কিন্তু প্রতিটি কমান্ডের জন্য একটি নতুন এক করা এর এটা সমস্যা, না?)
yrk

2
আমার মনে হয় না আমাদের উঁচু হওয়া উচিত। এটি সর্বোপরি একটি বৈধ সমাধান।
hobbes3

1

এটি একটি ছোট স্ক্রিপ্ট যা এটি করে:

for var in `find . -type f -name "*(1).m4a"`; do
    new=`echo $var | cut -d'(' -f1`;
    mv $var $new.m4a;
done

এই এক তাদের নামে ফাঁকা জায়গা ফাইলগুলিতে শ্বাসরোধ করবে; এটা জন্য বড় যথেষ্ট অস্থায়ী সঞ্চয়স্থান প্রয়োজন`find ...`
yrk
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.