ফোল্ডারে প্রতিটি png এর জন্য txt ফাইল তৈরি করতে চান


12

আমার এই স্ক্রিপ্ট আছে

#!/bin/bash

folder='/home/data/mnist/training'

for filePng in $folder/*
do
touch $filePng.txt
done

এটি কাজ করে, কেবল এটির জন্য একটি ফাইলের পরিবর্তে 001.pngএটি তৈরি 001.png.txtকরে 001.txt

আমি কীভাবে এটি সংশোধন করতে পারি?


4
আপনার ভেরিয়েবলগুলি উদ্ধৃত করা একটি ভাল অভ্যাস habit শেল স্ক্রিপ্ট একটি অদ্ভুত ভাষা যা সময়ের সাথে সাথে বিকশিত হয়ে পুরোদস্তুর নকশা তৈরির চেয়ে পুরোপুরিভাবে বিকশিত হয়েছিল, তাই দুর্ভাগ্যক্রমে এরকম কিছু বিরক্তিকর জিনিস প্রয়োজনীয় হয়ে ওঠে। আপনার ভেরিয়েবলগুলি উদ্ধৃত না করে, ভেরিয়েবলের বিষয়বস্তুগুলিতে সাদা স্থান বা অ্যাসিটার্কগুলি অদ্ভুত উপায়ে জিনিসগুলি ভেঙে দেবে। আপনার স্ক্রিপ্টগুলি আরও শক্তিশালী করতে সর্বদা আপনার ভেরিয়েবলের ব্যবহারগুলিকে ডাবল কোট দিয়ে ঘিরে রাখুন। এখানে, আপনি বলবেন for filePng in "$folder"/*এবং touch "$filePng".txt - নোটগুলি কেবলমাত্র যখন এ এর ​​আগে করা হবে তখন সেগুলি উদ্ধৃত করুন $
মুজার

3
এটি একটি এক্সওয়াই সমস্যার মতো দেখাচ্ছে ... আপনি কেন এটি চেষ্টা করছেন?
জেরোজেজে

উত্তর:


16

আপনি basenameএখানে কমান্ডটি ব্যবহার করতে পারেন :

touch "$folder/$(basename "$filePng" .png).txt"

অতিরিক্ত নোট করুন $folder/। বেসনেম কমান্ড যে পথটি সরিয়ে ফেলেছে এটি এটি প্রয়োজনীয়।


আমি কি আপনাকে পরামর্শ দিতে পারি যে আপনি আপনার প্যারামিটার সম্প্রসারণ এবং কমান্ড প্রতিস্থাপনের উদ্ধৃতি দিয়েছেন?
টম ফেনেক

@ টমফেনেক হ্যাঁ, পুরো স্ট্রিংটি উদ্ধৃত করার জন্য সম্ভবত একটি ভাল ধারণা। আমি আমার উত্তর সম্পাদনা করেছি।
ওয়েন_ ইয়াক্স

আপনি আশেপাশের অভ্যন্তরীণ উদ্ধৃতিগুলি কেন সরিয়েছেন তা আমি নিশ্চিত নই $filePng- সেগুলিও কার্যকর ছিল।
টম ফেনেক

1
না, কারণ $( )একটি নতুন উদ্ধৃতি প্রসঙ্গটি স্থাপন করে।
টম ফেনেক

2
ওহ, আপনি ঠিক বলেছেন - আজ নতুন কিছু শিখেছেন ;-)
ওয়েন_ ইয়াক্স

31

আপনি শেলের প্যারামিটার সম্প্রসারণ বৈশিষ্ট্যগুলি ব্যবহার করে বিদ্যমান এক্সটেনশনটি সরাতে পারেন

${parameter%pattern}'প্যারামিটার' শেষের সাথে 'প্যাটার্ন' মেলে। ফলাফলটি হ'ল সংক্ষিপ্ততম ম্যাচটি মুছে ফেলার সাথে 'পরামিতি'র প্রসারিত মান।

সুতরাং আপনার ক্ষেত্রে, $filePng.txtসঙ্গে প্রতিস্থাপন"${filePng%.png}.txt"


10

স্ট্যান্ড্রাইভার ইতিমধ্যে উল্লিখিত হয়েছে তার পরিবর্তনের সাথে - প্যারামিটার সম্প্রসারণ - আমরা কাজটি করতে স্ট্রিং প্রতিস্থাপনটি ব্যবহার করতে পারি। অতিরিক্তভাবে, আপনার চলকগুলি উদ্ধৃত করা উচিত। নীচে আপনার সম্পাদিত স্ক্রিপ্ট আছে।

#!/bin/bash

folder='/home/data/mnist/training'

for filePng in "$folder"/*
do
    touch "${filePng/.png/.txt}"
done

9

আপনার তৈরি করার জন্য যদি প্রচুর ফাইল থাকে তবে এটি একবারে একাধিক ফাইলকে "স্পর্শ" করা সার্থক হবে, যাতে আপনার প্রতিটির জন্য একটি নতুন প্রক্রিয়া তৈরি করার প্রয়োজন নেই (একাধিক সঞ্চালনের ক্ষেত্রে বেশ কিছুটা সময় লাগে) হাজার বার).

বিকল্প 1: প্যাটার্ন প্রতিস্থাপন + xargs

এই বিকল্পটি touchএকবারে কমান্ডকে একাধিক পাথ সরবরাহ করবে , সাধারণত কয়েক হাজার বা সিস্টেম যা কোনও একক কমান্ড লাইনে ফিট করতে পারে।

find "$folder" -mindepth 1 -maxdepth 1 -name '*.png' -print0 |
sed -ze 's/\.png$/.txt/' |
xargs -r0 -- touch --

বিকল্প 2: প্যারামিটার সম্প্রসারণ + কমান্ড আউটপুট পুনঃনির্দেশ

এই বিকল্পটি মোটেও চলবে না touchতবে বাশ / বোর্ন / পসিক্স শেল বৈশিষ্ট্যগুলি ব্যবহার করে যার জন্য সাব-প্রসেসের প্রয়োজন হয় না।

for f in "$folder"/*.png; do
    : >> "${f%.png}.txt"
done

4

যদি আপনি আত্মবিশ্বাসী হন যে .pngনামের কোথাও কোথাও আপনার কাছে ফাইল নেই তবে আপনি কেবলমাত্র প্যারামিটার বিস্তৃতি সহ একটি অ্যারে ব্যবহার করতে পারেন:

pngs=( /path/to/pngs/*.png )
touch "${pngs[@]/.png/.txt}"

এটি .pngঅ্যারেতে শেষ হওয়া ফাইলগুলির সমস্ত পাথ সংরক্ষণ করে এবং তারপরে .txtফাইলগুলির তালিকা তৈরি করতে প্রতিটি একের পরিবর্তে প্যারামিটার সম্প্রসারণ .pngব্যবহার .txtকরে।

মনে রাখবেন যে আপনার যদি এতগুলি ফাইল থাকে তবে সেগুলি ভেঙে যাবে যাতে সেগুলি একই অনুরোধের জন্য আর্গুমেন্ট হিসাবে পাস করা যায় না touch

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