কীভাবে 'ফাইন্ড-এক্সেক' স্পেস সহ ফাইলের নাম পাস করে?


14

যদি আমার কাছে এমন কিছু ডিরেক্টরি থাকে যার নামগুলির ফাঁকা স্থান থাকে, উদাহরণস্বরূপ

$ ls -1 dir1
file 1
file 2
file 3

আমি তাদের সকলকে এই জাতীয় ডিরেক্টরিতে সফলভাবে অনুলিপি করতে পারি:

$ find dir1 -mindepth 1 -exec cp -t dir2 {} +

যাইহোক, এর আউটপুটটিতে find dir1 -mindepth 1আন-পালানো স্থানগুলি রয়েছে:

$ find dir1 mindepth 1
dir1/file 1
dir1/file 3
dir1/file 3

আমি যদি এর print0পরিবর্তে ব্যবহার করি printতবে আউটপুটটিতে এখনও অব্যাহত স্থান রয়েছে:

$ find dir1 mindepth 1 -print0
dir1/file 1dir1/file 2dir1/file 3

এই ফাইলগুলি ম্যানুয়ালি ব্যবহার করে অনুলিপি করতে cp, আমার স্পেসগুলি থেকে পালাতে হবে; তবে মনে হয় এটি অযৌক্তিক হয় যখন আমি ব্যবহার করি বা কমান্ডের শেষে ব্যবহার করি না কেন, যখনই cpসেগুলি আসে unnecessaryfind+\;

এর কারণ কী?

উত্তর:


8

findকমান্ড সরাসরি কমান্ড সঞ্চালন করে। ফাইলের নাম আর্গুমেন্ট সহ কমান্ডটি শেল বা ফাইলের নাম পরিবর্তন করতে পারে এমন অন্য কোনও কিছু দ্বারা প্রক্রিয়া করা হবে না। এটা খুব নিরাপদ।

আপনি সঠিক ফাইলের নামের যার দ্বারা প্রতিনিধিত্ব করা হয় অব্যাহতি দরকার নেই যে {}উপর findকমান্ড লাইন।

find-execআপনার ক্ষেত্রে, কমান্ডটি, কমান্ডের অভ্যন্তরীণ আর্গুমেন্ট তালিকায় সরাসরি ডিস্ক থেকে কাঁচা ফাইলনাম পাস করে cp


1
সংক্ষেপে, find..execঅদ্ভুত ফাইলের নামগুলি নিজেই পরিচালনা করতে পারে ..
হিমাইল

2
লিনাক্স ক্লাবের প্রথম নিয়মটি হল আপনি
এলএসকে

5

প্রশ্নটি দ্বি-অংশ:

  • কিভাবে করে find ব্যবহার কল প্রোগ্রাম পরিচালনা -execফাইলের নামের এমবেড ব্যবধান সহ সমস্যায় চলমান ছাড়া, এবং
  • -print0বিকল্প কি ভাল ?

প্রথমটির জন্য, findএকটি সিস্টেম কল করা হচ্ছে, সম্পর্কিত কলগুলির একটি গ্রুপ যা "এক্সিকিউটিভ" হিসাবে পরিচিত । এটি সরাসরি এই কলটিতে আর্গুমেন্ট হিসাবে ফাইলনামটি পাস করে, যা পরে ফাইলটির নাম না হারিয়ে সরাসরি (একটি নতুন প্রক্রিয়া তৈরির পরে) পাস করা হয়।

POSIX findবৈশিষ্ট্য +নিম্নরূপ এ, ব্যাখ্যা করা হয় যুক্তিপূর্ণ :

এসভিআর 4 এর findইউটিলিটির একটি বৈশিষ্ট্য ছিল -execপ্রাথমিকের + টার্মিনেটর। বিশেষ ফাইলের অক্ষর (বিশেষত নিউলাইন চরিত্রগুলি) থাকা ফাইলের নামগুলি এই জাতীয় ফাইলগুলিতে পাইপ করা থাকলে যে সমস্যাগুলি হয় সেগুলি ছাড়াই একসাথে গ্রুপ করা যায় xargs। অন্যান্য বাস্তবায়নগুলি এই সমস্যাটি সমাধানের অন্যান্য উপায় যুক্ত করেছে, বিশেষত এমন একটি -print0প্রাথমিক যা নাল বাইট টার্মিনেটর সহ ফাইলের নাম লিখেছিল। এটি এখানে বিবেচনা করা হয়েছিল, তবে গৃহীত হয়নি। নাল টার্মিনেটর ব্যবহারের অর্থ হ'ল যে কোনও ইউটিলিটি যা অনুসন্ধানের -print0আউটপুট প্রসেস করতে চলেছে তার নাল টার্মিনেটরগুলি পার্স করার জন্য একটি নতুন বিকল্প যুক্ত করতে হবে যা এটি পড়বে।

এটি " উল্লেখযোগ্যভাবে একটি -print0প্রাথমিক" জিএনইউকে বোঝায় findএবং xargsযা সমস্যাটিকে অন্যভাবে সমাধান করে। এটি ফ্রিবিএসডি findএবং দ্বারাও সমর্থিত xargs। আপনি যদি কলটিতে একটি -0বিকল্প যুক্ত করেন ( ম্যানুয়াল পৃষ্ঠাটি দেখুন ) xargs, তবে সেই প্রোগ্রামটি "নাল বাইট" অক্ষর দ্বারা সমাপ্ত লাইনগুলি গ্রহণ করে। ক্রমে, xargsকল Exec করতে -functions তার হবে। বৈশিষ্ট্য -print0এবং -0বনাম বৈশিষ্ট্যের মধ্যে প্রধান পার্থক্যটি +হ'ল প্রাক্তনটি একটি পাইপের উপর দিয়ে ফাইলের নামগুলি পাস করে, যখনটিরটি পরে না। বিকাশকারীরা প্রায় কোনও বৈশিষ্ট্যের জন্য ব্যবহারগুলি খুঁজে পান; পাইপগুলিও তার ব্যতিক্রম নয়।

ওপির উদাহরণে ফিরে যান, যা এর জন্য একটি -tবিকল্প ব্যবহার করে cp: যা পসিক্স সিপিতে পাওয়া যায় না । বরং এটি একটি এক্সটেনশন (ওরফে "নন-স্ট্যান্ডার্ড ফিচার") জিএনইউ সিপি সরবরাহ করেছে-0সম্প্রসারণ xargsএই উদাহরণে উন্নত না, কিন্তু অন্যান্য ক্ষেত্রে যেখানে এটা মনে কার্যকরভাবে পালন পোর্টেবল বিকল্প নেই ব্যবহার করা যায় +, যা গনুহ findগ্রহণ করে।


-1

( এটি একটি মন্তব্য হওয়া উচিত তবে এটি খুব বড় ))

যারা জিনিস চেষ্টা করে দেখতে চান তাদের জন্য:

পাস হওয়া একটি স্ক্রিপ্টের তালিকাভুক্ত অবস্থানগত পরামিতি তৈরি করুন, এটিকে কল করুন list_positional_parameters.sh

#!/bin/bash

# http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_07.html
# Try globbing patterns, e.g. "X[[:digit:]][[:digit:]]" to see what happens

if [ $# -lt 1 ]; then
   echo "Usage: $0 and then at least one parameter"
   exit 1
fi

counter=1

while (($#)); do
   echo "$counter = '$1'"
   # pop positional argument 1 off the stack of positional arguments
   shift
   (( counter++ ))
done

findএটি দিয়ে কোনও ডিরেক্টরিতে চালান ir dir:

find "$dir" -exec ./list_positional_parameters.sh '{}' ';' | less

যেমনটি প্রত্যাশা করা হয়েছিল, সমস্ত কলগুলিতে কেবলমাত্র একক প্যারামিটার রয়েছে, ফাইলের নাম, তার নামে ফাঁকা স্থান রয়েছে কিনা।


1
আপনি ভিজ্যুয়াল পরিদর্শনের জন্য উদ্ধৃত সমস্ত অবস্থানগত আর্গুমেন্ট প্রিন্ট করতে printfপছন্দ printf '"%s"\n' "$@"করতে পারেন ।
কুসালানন্দ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.