লিনাক্স শেল ব্যবহার করে স্পেস দিয়ে ফাইলগুলির নাম পরিবর্তন করব?


28

আমি তাদের ফাঁকা জায়গাগুলির সাথে বেশ কয়েকটি ফাইলের নাম দিয়েছি এবং আমি স্থানটি এর সাথে প্রতিস্থাপন করতে চাই _। যাইহোক, আমি যখনই শেলটিতে ফাইলের নামের সাথে উদাহরণ লিখি (উদাহরণস্বরূপ Spring 2011), শেলটি ফাইল বা ডিরেক্টরিটি চিনতে পারে না।

আমি এই সম্পর্কে কি করতে পারেন? কোনও জায়গার জন্য ইউনিকোড চরিত্রটি ব্যবহার করার কোনও উপায় আছে কি?


প্রোগ্রামযুক্তভাবে এন ফাইলগুলির নামকরণের bashজন্য, লুপের জন্য একটি ব্যবহার করুন: আমার সমাধানটি এখানে দেখুন
ট্রেভর বয়ড স্মিথ

উত্তর:


33

স্পেস ছেড়ে যান, যেমন Spring\ 2011, বা উদ্ধৃতি ব্যবহার করুন, যেমন 'Spring 2011'। ভবিষ্যতে, কোনও * NIX এ ফাঁকে ফাঁকে ফাইলের নাম ব্যবহার করা সাধারণত একটি খারাপ ধারণা।

যদি আপনি পেয়ে থাকেন তবে renameআপনি এটি ব্যবহার করতে পারেন:

rename ' ' '_' [filenames...]

1
আপনি কি জানেন যে একবারে সমস্ত ফাইলের জন্য এটি করার উপায় আছে?

3
কেন এটি একটি খারাপ ধারণা? ফাইলনামগুলি সঠিকভাবে পরিচালনা করা প্রোগ্রামারের দায়িত্ব।
গ্লেন জ্যাকম্যান

1
@ ইরফ, সত্যিই সামনে ফাইল নাম সঠিকভাবে পরিচালনা না করার প্রবণতা error আপনি যখন কোনও ফাইল নাম সম্বলিত ভেরিয়েবলগুলি উদ্ধৃতি করতে ভুলে গিয়েছিলেন তখন কোনও স্ক্রিপ্ট ডিবাগ করার সময় অতিরিক্ত প্রচেষ্টা আসে।
গ্লেন জ্যাকম্যান

3
এই উত্তরটি কাজ করে না বলে মনে হচ্ছে (কমপক্ষে উবুন্টু 12.04 এলটিএসে)। আনতুবু থেকে উত্তরটি ঠিক কাজ করে।
ডিএনএ

1
এটি কেবলমাত্র আমার জন্য প্রথম স্থানটি করেছিল ... যা সহায়ক নয় (আমার renameসংস্করণ ২.২৩ রয়েছে)
ট্রেভর বয়েড স্মিথ

30

যদি আপনার মেশিনটির পুনর্নবীকরণ কমান্ড থাকে, তবে এটি বর্তমান ওয়ার্কিং ডিরেক্টরিতে সমস্ত ফাইল / ডিয়ারের সমস্ত স্থানকে আন্ডারস্কোরগুলিতে পরিবর্তন করবে:

rename 's/ /_/g' *

উবুন্টু 12.04
এন্থনিগোরে

1
আমার পক্ষে কাজ করে নি ... আমি "পুনর্নামকরণ: পর্যাপ্ত যুক্তি নেই" একটি ত্রুটি পেয়েছি। আমি সংস্করণ আছে rename --version rename from util-linux 2.23.2
ট্রেভর বয়ড স্মিথ

24

আপনার যদি না থাকে renameবা কেবল শেলটি ব্যবহার করতে পছন্দ করেন:

for f in *\ *; do mv "$f" "${f// /_}"; done

ভেঙ্গে পড়া:

  • *\ *forলুপের ইনপুট হিসাবে তাদের নামে একটি স্থান সহ সমস্ত ফাইল নির্বাচন করে ।
  • আশেপাশের উদ্ধৃতিগুলি "$f"গুরুত্বপূর্ণ কারণ আমরা জানি ফাইলের মধ্যে একটি জায়গা আছে এবং অন্যথায় এটি 2+ টি যুক্তি হিসাবে উপস্থিত হবে mv
  • ${f//str/new_str}বাশ-নির্দিষ্ট স্ট্রিং প্রতিস্থাপন বৈশিষ্ট্য। সমস্ত দৃষ্টান্ত দিয়ে strপ্রতিস্থাপন করা হয় new_str

2
এটি কাজ করে তবে আমার জন্য এটি কেবল প্রথম স্থানটি প্রতিস্থাপন করে। যদি আমি for f in *\ *; do mv "$f" "${f// /_}"; doneএটি ব্যবহার করি
বিলিএনও

@ বিলিন্নাহ ভাল ক্যাচ, আপডেট হয়েছে updated
blahdiblah

@ ব্লাহাদিবলাহ আপনাকে অনেক ধন্যবাদ! তুমি আমাকে এত সময় বাঁচিয়েছ!
গেরিলা

@blahdiblah আপনার সমাধান উপায় পথ চেয়ে বেশি মার্জিত আমার সমাধান । ভাল করেছ. আমি ভাবি নি যে লুপ গ্লোব কাজ করবে ... সুতরাং আমি লুপটির বাইরে গ্লোবটি করেছি।
ট্রেভর বয়ড স্মিথ

3

mv "Spring 2011.file" Spring_2011.file উদ্ধৃত স্ট্রিংটিকে একক ইনপুট হিসাবে নিতে কমান্ড-লাইনকে বলা উচিত।


এটিই কেবলমাত্র উত্তর যা আমি কাজ পেতে পারি।
ব্লেকফট

1

প্রোগ্রামযুক্তভাবে এন ফাইলগুলির নাম পরিবর্তন করতে, আপনি bashলুপের জন্য একটি সাধারণ ব্যবহার করতে পারেন ।

#!/bin/bash

set -eux

# find all your files by using a `grep` pattern
pattern="insert_filename_pattern_here" # you must enter your filename pattern here

# create an array of filenames and split on newlines
IFS=$'\n'
tmp=($(ls | grep ${pattern}))
unset IFS

# for each filename
for filename in "${tmp[@]}"; do
    # rename the filename to use "_" character instead of a " " character
    mv -v "${filename}" "${filename// /_}"
done

যদি আপনার 5 টিরও কম ফাইলের নাম থাকে তবে আপনি নিজে সমস্ত ফাইল নাম টাইপ করতে renameপারেন এবং উপরের সমাধানের মতো কমান্ডটি ব্যবহার করতে পারেন । তবে আমার জন্য ... আমি প্রোগ্রামিমেটিক সমাধানটি পছন্দ করি ... এমনকি যখন কেবল 4 টি ফাইল থাকে।

PS

আপনি যদি Bashপ্যারামিটার এক্সপেনশন (যেমন ${filename// /_}) এর সাথে পরিচিত না হন তবে আপনি renameকমান্ডটি ব্যবহার করতে পারেন :

if ((0)); then
    mv -v "${filename}" "${filename// /_}"
else
    rename ' ' '_' "${filename}"
fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.