কেন এই xargs কমান্ড কাজ করে না?


14

আমি সমস্ত .sh এক্সটেনশানগুলি মুছে ফেলতে চেয়েছিলাম তাই করেছে:

ls *.sh | xargs -I {} mv {} `basename {} .sh`

তবে এটি কাজ করে না, এটি basenameঅপরিবর্তিত ফাইলের নামের মতো আচরণ করে ।

কেন এমনভাবে আচরণ করা হচ্ছে?

উদাহরণস্বরূপ, এটি কাজ করে:

ls *.sh | xargs -I {} echo `basename {}.jpg .jpg`;

সম্পাদনা :

সমাধান: `basename ...`কমান্ড চালানোর আগে একক উদ্ধৃতি শেল দ্বারা মূল্যায়ন রোধ করে।

ls *.sh | xargs -I {}  sh -c 'mv {} `basename {} .sh`'

উত্তর:


12

কারণ পাইপলাইন চালানোর আগে বেসনেম কমান্ডটি চালানো হয়। এই কাজটি করার জন্য আপনার বেসনেম এক্সিকিউট করতে এক্সার্গস দরকার এবং আপনি এটি দিয়ে এটি করতে পারেন sh -c, যেমন:

ls *.sh | xargs -L1 sh -c 'basename $1 .sh' dummy

মন্তব্য:

  • আপনি যদি xargsফাইলের নামগুলি সন্নিবেশ করানোর জন্য না জানান তবে সেগুলি কমান্ড লাইনের শেষে যুক্ত করা হবে।
  • আপনার -L1স্যুইচ বা এর সমতুল্য ব্যবহার করা উচিত , সুতরাং xargsকেবলমাত্র একটি যুক্তি পাস করে sh
  • এর আউটপুট ব্যবহার করার ফলে অযাচিত প্রভাবls থাকতে পারে ।

সম্পাদন করা

অবহেলিত বিকল্পগুলি সরানো হয়েছে, ধন্যবাদ টেকজিলা


3
আপনার প্রথম পয়েন্টটি ভুল, যদি না আপনি বোঝাতে চান এটি ডিফল্টরূপে -iবিকল্পটির সাথে সম্পর্কিত তবে সেই 'ক্লাসিক' বিকল্পগুলি হ্রাস করা হয়েছে। উদাহরণস্বরূপ কেবল একটি বিকল্প / লাইন ব্যবহার করার জন্য, নতুন পসিক্স ম্যান পৃষ্ঠাটি সুপারিশ করে -L1। এর পুরানো আচরণটি কল করতে -i, পৃষ্ঠাটি -I'{}'বিকল্পটি সুপারিশ করে ।
জেএম বেকার

সুতরাং, এটি আসলে "" পরিবর্তে "" প্রতীকগুলির সম্পর্কে। আমার ধারণা 'শেল মূল্যায়ন `preven রোধ করে` আমার সম্পাদনা দেখুন।
majkinetor

@ টেকজিলা: সংশোধন করার জন্য ধন্যবাদ। @ মাজকিনেটর: হ্যাঁ এবং না, আপনাকে মূল্যায়নটি বিলম্ব করতে হবে, তবে আপনি ব্যাকটিক্স (`) ব্যবহার করতে পারবেন বলে আমি মনে করি না।
থর

1
@ মাজকিনেটর: আহ, আমি এখন আপনাকে কী বোঝাতে চাইছি তা দেখতে পাচ্ছি। এই পদ্ধতিতে আমি বরং ব্যবহার করেন ফাইল নামান্তর করতে rename, যেমন: rename 's/\.sh//' *.sh। শুকনো রান ( -n) দিয়ে প্রথমে চেষ্টা করুন ।
থর

1
@ মজকিনেটর: renameদুর্দান্ত কাজ করে এবং মোটামুটি সহজ, তবে মনে রাখবেন এটি খুব বিতরণ নির্দিষ্ট। আরএইচইএল এবং ডেবিয়ান ভিত্তিক বিতরণগুলি বিভিন্ন renameকমান্ড সরবরাহ করে, তাই ক্রস-ডিস্ট্রো স্ক্রিপ্টগুলি তৈরি করার সময় এটি অবশ্যই মনে রাখা উচিত।
জেএম বেকার

4

আমি আপনার প্রশ্ন সম্পর্কে অনিশ্চিত, আপনি কি আসলেই জিজ্ঞাসা করছেন কেন আপনার প্রথম লাইনটি কাজ করে না? বা আপনি সমস্ত .sh ফাইলের নাম পরিবর্তন করার জন্য কোনও সঠিক পদ্ধতি খুঁজছেন?

এটি সবচেয়ে পরিষ্কার পদ্ধতি হিসাবে ধরে নেওয়া, আমি আগে কমান্ড বিকল্প প্রস্তুত করতে পছন্দ করি xargs। একটি .sh ফাইল এক্সটেনশন অপসারণের জন্য, আমি প্রায়শই এই পদ্ধতির বিষয়টি বিবেচনা করি,

 find -maxdepth 1 -type f -iname '*.sh'  | sed 'p;s_.sh$__' | xargs -L2 mv
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.