কেন হয় না
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 {} \;
তবে আমি বুঝতে পারি না কেন $(...)
নির্মাণ কাজ করবে না কেন এটি কাজ করবে ।
${file:0:5}
ফেরৎ{}
যদি$file={}
। আমি যখন$(file={}; echo ${file:0:1})
এটি ব্যবহার করি তখনই কেবল ফলাফল হয়{
।