অনুসন্ধানের জন্য এক্সেক প্যারামিটারে সাবস্কেল যুক্তি (1)


7

কেন হয় না

find . -type f -exec echo $(file={}; echo ${file:0:5}) \;

ফাইলটির প্রথম পাঁচটি অক্ষর দিন, যখন এটি কাজ করে:

find . -type f -exec bash -c 'echo ${1:0:5}' funcname {} \;

পটভূমি :

আমি ব্যাচের সাথে ইমেজ ভরা একটি গাছকে থাম্বনেইলে রূপান্তরিত করার চেষ্টা করছি এবং আমি ফাইল নামের শেষে কিন্তু এক্সটেনশনের আগে '_thumb' যোগ করে ফ্লাইতে তাদের নাম পরিবর্তন করতে চাই। এই নামকরণ প্রক্রিয়াটি একটি ফাইলের পক্ষে সহজ:

file='I am a picture.jpg'
mv \"$file\" \"${file%\.*}_thumb.${file##*\.}\"

(দ্বিতীয় লাইনটি প্রসারিত হয় mv "I am a picture.jpg" "I am a picture_thumb.jpg")

তবে যখন আমি এই কমান্ডটি -execপ্যারামিটারে সজ্জিত করার চেষ্টা করি তখন আমি find(1)প্রদত্ত ফাইলের নামটি ব্যবহার করতে পারি না find(উদাহরণগুলি সরলীকৃত):

find . -type f -exec ${{}:0:5}) \;

দেয়

bash: ${{}:0:5}: bad substitution

একটি সাব-শেল ব্যবহার করে আমি আরও কিছুটা পেতে পারি:

find . -type f -exec echo $(file={}; echo ${file:0:5}) \;

এটি ফাইলের নাম প্রতিধ্বনিত করে তবে কোনও কারণে স্ট্রিং ম্যানিপুলেশন চালায় না।

শেষ পর্যন্ত আমি এই এসও পোস্টে সমাধানটি পেয়েছি :

find . -type f -exec bash -c 'echo ${1:0:5}' funcname {} \;

তবে আমি বুঝতে পারি না কেন $(...)নির্মাণ কাজ করবে না কেন এটি কাজ করবে ।

উত্তর:


7

execএটি যা বলে তা করে: ব্যবহার করে exec()। এটা একটা শেল যদি না তা (বলা হচ্ছে সঙ্গে যুক্ত নয় -exec bash ...), এবং আপনি তাহলে তা এখনও একক উদ্ধৃতি প্রয়োজন পরিবর্তনশীল interpolations ব্যাখ্যা থেকে আপনার ইন্টারেক্টিভ শেল রাখা। (শেলটি যাদু নয় এবং আপনি জানেন না যে আপনি সেগুলি অন্য কোনও কিছু দ্বারা বিভক্ত করার ইচ্ছা করেছিলেন intended)


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

খুঁজে। -type f -exec প্রতিধ্বনি $ (ফাইল = {}; প্রতিধ্বনি $ {ফাইল: 0: 5}) \;

আপনার শেল প্রথমে সম্পাদন করে প্রক্রিয়া প্রতিস্থাপন সম্পাদন করে $(file={}; echo ${file:0:5}), যা কেবল আউটপুট করে {}, তারপরে চূড়ান্ত আদেশটি কার্যকর করে:

খুঁজে। -প্রকার চ-এক্সেক প্রতিধ্বনি {} \;

আহ, আমি এখন দেখতে। অবশ্যই ${file:0:5}ফেরৎ {}যদি $file={}। আমি যখন $(file={}; echo ${file:0:1})এটি ব্যবহার করি তখনই কেবল ফলাফল হয় {
টিম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.