লিনাক্সে পুনরাবৃত্তভাবে ফাইলগুলির নাম পরিবর্তন করুন (এক্সটেনশন পরিবর্তন করুন)


22

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

find . -name "*.andnav" -exec rename .andnav .tile {} \;
syntax error at (eval 1) line 1, near "."

...

rename -nv 's/\.andnav$/\.tile/i' *.andnav
0.png.andnav renamed as 0.png.tile

1
আপনার কি দেবিয়ান renameবা রেড হ্যাট রয়েছে rename?
Ignacio Vazquez-Abram

@ ইগনাসিও: উবুন্টু = দেবিয়ান?
এন্ডোলিথ

হ্যাঁ, উবুন্টু একটি ডেবিয়ান ডেরিভেটিভ।
Ignacio Vazquez-Abram

উত্তর:


23

এটা বের করে আনা

find . -name "*.andnav" -exec rename -v 's/\.andnav$/\.tile/i' {} \;
./0/0.png.andnav renamed as ./0/0.png.tile
./0/1.png.andnav renamed as ./0/1.png.tile
./1/0.png.andnav renamed as ./1/0.png.tile
./1/1.png.andnav renamed as ./1/1.png.tile

আসলে এটি করার সময় -v অবশ্যই মুছে ফেলুন, বা এটি সমস্ত ফাইল প্রদর্শনের সময় নষ্ট করবে


14

কিছুটা এইরকম:

find . -name '*.andnav' -exec sh -c 'mv "$0" "${0%.andnav}.tile"' {} \;

এই আমার জন্য সবচেয়ে ভাল কাজ করেছে
cwd


4

আমি এই পদ্ধতিটি পড়া সহজ এবং সহজ:

find . -name "*.andnav" | rename "s/\.andnav$/.tile/"

কমপক্ষে উবুন্টু ডেরাইভেশনগুলিতে পুনরায় নামকরণ STDIN থেকে ফাইলগুলির একটি তালিকা নেয় যদি কোনওটি কমান্ড লাইনে না থাকে। এবং এটির মাধ্যমে সহজে পরীক্ষা করা যায়:

find . -name "*.andnav" | rename -vn "s/\.andnav$/.tile/"

আপনি এটি সঠিক না হওয়া পর্যন্ত


1

ফাইল এবং ডিরেক্টরিগুলির সাথে নতুন নামকরণ করুন find -execdir | rename

আপনি যদি কেবল দুটি প্রত্যয় না দিয়ে ফাইল এবং ডিরেক্টরি দুটিরই নাম পরিবর্তন করতে চলেছেন তবে এটি একটি ভাল প্যাটার্ন:

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
  find . -depth -execdir rename 's/findme/replaceme/' '{}' \;

ভয়ঙ্কর -execdirবিকল্পটি কমান্ডটি cdকার্যকর করার পূর্বে ডিরেক্টরিটিতে একটি করে তোলে rename, বিপরীত -exec

-depth হারিয়ে যাওয়া অভিভাবক ডিরেক্টরিগুলির সাথে সম্ভাব্য সমস্যাগুলি রোধ করার জন্য পুনরায় নামকরণটি শিশুদের এবং তারপরে পিতামাতার উপর ঘটে তা নিশ্চিত করুন।

-execdir প্রয়োজনীয় কারণ নন-বেসনাম ইনপুট পাথগুলির সাথে নামটি ভাল খেলতে পারে না, যেমন নিম্নলিখিত ব্যর্থতা:

rename 's/findme/replaceme/g' acc/acc

PATHহ্যাকিং প্রয়োজনীয় কারণ -execdirএক খুব বিরক্তিকর অপূর্ণতা আছে: findঅত্যন্ত একগুঁয়ে হয় এবং নিয়ে কিছু করতে রাজি -execdirযদি আপনি আপনার যে কোন আপেক্ষিক পাথ আছে PATHএনভায়রনমেন্ট ভেরিয়েবল, যেমন ./node_modules/.bin, সঙ্গে ব্যর্থ:

সন্ধান করুন: আপেক্ষিক পথ './node_modules/.bin' PATH এনভায়রনমেন্ট ভেরিয়েবলের মধ্যে অন্তর্ভুক্ত করা হয়েছে, যা সন্ধানের-এক্সেকডির পদক্ষেপের সাথে একাত্মকভাবে সুরক্ষিত। দয়া করে entry PATH থেকে এন্ট্রিটি সরিয়ে দিন

আরও দেখুন: /ubuntu/621132/why- using-the-execdir-action-is-insecure-for-directory-Wich-is-in-the-path / 1109378#1109378

-execdirPOSIX- এ GNU অনুসন্ধান এক্সটেনশনrenameপার্ল ভিত্তিক এবং renameপ্যাকেজ থেকে আসে । উবুন্টুতে পরীক্ষা করা হয়েছে 18.10।

চেহারা অনুসারে নতুন নামকরণ করুন

যদি আপনার ইনপুট পাথগুলি আসে না find, বা যদি আপনার কাছে আপেক্ষিক পাথর বিরক্তি যথেষ্ট পরিমাণে থাকে তবে আমরা কিছু পার্ল লুক হেড ব্যবহার করতে পারি ডিরেক্টরিগুলি নিরাপদে নামকরণ করতে:

git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'

আমি একটি সুবিধাজনক অ্যানালগ খুঁজে পেলাম না -execdirসঙ্গে xargs: xargs: পরিবর্তন চালানোর আগে ফাইল পথে ডিরেক্টরির কাজ করেন?

sort -rতা নিশ্চিত করার জন্য ফাইল, তাদের নিজ নিজ ডিরেক্টরি পরে আসা যেহেতু আর পাথ একই প্রেফিক্স সহ খাটো বেশী পরে আসা প্রয়োজন।

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