এমভি: শেল স্ক্রিপ্টে এই জাতীয় কোনও ফাইল বা ডিরেক্টরি স্থির করতে পারে না


16

আমি কিছু স্ক্রিপ্ট লিখেছি যাতে কিছু ফাইল অন্য ফোল্ডারে একটি ফোল্ডার তৈরি করে তবে আমি নিম্নলিখিত ত্রুটিটি পেয়েছি, আমি 2 ফোল্ডার চেক করেছি এবং বিজ্ঞপ্তি দিয়েছি যে 1 ফোল্ডারের মধ্যে এই জাতীয় ফাইল রয়েছে এবং অন্যটিতে এই জাতীয় কোনও ফাইল নেই, তবে কেন তারা সবগুলি "এমভি" দেখায় এই জাতীয় কোনও ফাইল বা ডিরেক্টরি স্থিত করতে পারে না "

    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/194.199.68.165_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/194.42.17.124_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/195.113.161.13_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/203.159.127.3_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/212.199.61.205_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/212.51.218.235_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/213.73.40.105_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/41.225.7.4_tcp.folder/data/*': No such file or directory
    mv: cannot stat `/home/esolve/project/capture/tcp_50x50/dest_folder/83.230.127.122_tcp.folder/data/*': No such file or directory
    [esolve@kitty tcp_50x50]$ ls /home/wgong/project/capture/tcp_50x50/dest_folder/194.199.68.165_tcp.folder/
    [esolve@kitty tcp_50x50]$ ls /home/wgong/project/capture/tcp_50x50/dest_folder/203.159.127.3_tcp.folder/data/
    129.88.70.226   132.187.230.1    138.96.116.22   155.185.54.250   192.38.109.144  193.136.227.163  193.175.135.61  195.113.161.13  83.230.127.122
    130.104.72.200  132.227.62.122   147.83.29.232   156.17.10.52     192.42.43.22    193.137.173.218  193.205.215.74  212.199.61.205
    131.130.69.164  132.252.152.194  148.81.140.193  157.181.175.249  192.43.193.71   193.144.21.131   193.226.19.30   212.51.218.235
    131.188.44.102  134.151.255.180  152.66.245.162  160.78.253.31    193.1.170.136   193.145.46.243   194.199.68.165  213.73.40.105
    131.254.208.10  138.48.3.203     152.81.47.4     192.114.4.3      193.136.166.56  193.166.160.98   194.42.17.124   41.225.7.4

লিপিটি হ'ল:

    list=`ls dest_folder`
    cd dest_folder
    cwd=`pwd`
    for folder in $list;do
            mv ${cwd}/${folder}'/data/*' ${cwd}/${folder}
    done

আমি এটা দৌড়ে /home/esolve/project/capture/tcp_50x50/


1
স্ক্রিপ্টের প্রাসঙ্গিক অংশগুলি দয়া করে দেখান।
মাদুর

আমি আমার প্রশ্ন আপডেট করেছি এবং স্ক্রিপ্ট যুক্ত করেছি, ধন্যবাদ!
মিস্টারয়েজ

আপনি কি একটি যোগ -rকরতে হবে mv ${cwd}/${folder}'/data/*' ${cwd}/${folder}?
ProfessionalAmateur

সেখানে নেই -rজন্য বিকল্পmv
misteryes

উত্তর:


25
mv ${cwd}/${folder}'/data/*' ${cwd}/${folder}

সেখানে উদ্ধৃতি ( ') শেলকে গ্লোব্বিং করতে বাধা দেয়। *থেকে আক্ষরিক পাস হচ্ছে mvকমান্ড, যা থেকে এটা বলা ফাইলগুলি খুঁজে না ব্যর্থ *ডিরেক্টরি নির্দেশিত হবে।

এটিতে এতে পরিবর্তন করুন:

mv "${cwd}/${folder}/data"/* "${cwd}/${folder}"

(আপনার যদি কখনও স্পেসিসের ডিরেক্টরি নাম থাকলে *কোটসের বাইরে থাকে তবে সমস্যাগুলি রোধ করার জন্য ডাবল কোটস )

যদিও খালি ডিরেক্টরিগুলির জন্য আপনি ত্রুটিগুলি পেয়ে যাবেন। (একই কারণে


ডাবল উদ্ধৃতিগুলি বোঝায়, তবে কেন আমার *উদ্ধৃতিগুলির বাইরে রাখা দরকার ?
সিবস জুয়াং

আপনি যদি এটি প্রসারিত করতে চান তবে আপনার এটি @ সিবসগাম্বলিং
মাদুর

8

আপনার কোড নিয়ে বেশ কয়েকটি সমস্যা রয়েছে:

list=`ls dest_folder`

আপনি lsনতুন লাইনের চরিত্রগুলিকে পিছনে না রেখে আউটপুট সংরক্ষণ করছেন $listlsনিউলাইন অক্ষরের সাথে পৃথক করা ফাইলের নামের তালিকা আউটপুট করে। newlineকোনও ফাইলের নামের মতো একটি চরিত্রের বৈধতা রয়েছে, যাতে আউটপুট নির্ভরযোগ্যভাবে ব্যবহার করা যায় না। উদাহরণস্বরূপ, lsযে ডিরেক্টরি রয়েছে aএবং bযে ডিরেক্টরিতে একটি ফাইল রয়েছে সেই ডিরেক্টরিতে এটির মতোই আউটপুট a<newline>b

 cd dest_folder

আপনি এই আদেশটির ব্যর্থতা পরীক্ষা করছেন না। সাধারণভাবে আপনার কমান্ডের প্রস্থান স্থিতি পরীক্ষা করা উচিত, তবে এটি বিশেষত সত্য cd, কারণ বাকী কমান্ডগুলি ধরে নেওয়া হয় যে আপনি সেই নতুন ডিরেক্টরিতে রয়েছেন এবং আপনি না থাকাকালীন নাটকীয় পরিণতি হতে পারে।

cwd=`pwd`

পজিক্স শেলগুলি ইতিমধ্যে $PWDচলক ডিরেক্টরিতে চলমান ডিরেক্টরিটির (এক) পাথটি বজায় রাখে , সুতরাং আপনার pwdএখানে ব্যবহার করার দরকার নেই (বিশেষত সাধারণ ক্ষেত্রে যেহেতু কমান্ড প্রতিস্থাপনটি পথ থেকে নতুন লাইনের অক্ষরগুলি সরিয়ে ফেলবে)। এছাড়াও, mvআপেক্ষিক পাথ গ্রহণ করে যাতে আপনার নিখুঁত পাথ তৈরির প্রয়োজন হয় না।

for folder in $list;do

একটি ভেরিয়েবলটি উদ্ধৃত না করা শেলগুলিতে বিভক্ত + গ্লোব অপারেটর। অর্থাত, ভেরিয়েবলের বিষয়বস্তু বিভক্ত হয় ( $IFSহোয়াইটস্পেসের জন্য বিশেষ বিধিগুলির সাথে পৃথককারীদের উপরে ), এবং সেই বিভাজনের ফলে প্রতিটি উপাদান ওয়াইল্ডকার্ডের অক্ষরগুলির সন্ধান করা হয় যাতে সেগুলি মিলে যাওয়া ফাইলগুলির তালিকায় প্রসারিত করা যায়।

এখানে, আপনি বিভাজন করতে চান, তবে কেবলমাত্র নতুন লাইন চরিত্রগুলিতে এবং আপনি গ্লোব্বিং চান না, তাই আপনার এটি অক্ষম করতে হবে:

 IFS='
 '; set -f
 for folder in $list
   mv ${cwd}/${folder}'/data/*' ${cwd}/${folder}

আবার একটি ভেরিয়েবলকে উদ্ধৃত না করা হ'ল স্প্লিট + গ্লোব অপারেটর। এখানে, আপনি উভয়ই চান না, সুতরাং আপনার সেই ভেরিয়েবলগুলি উদ্ধৃত করতে হবে।

ইতিমধ্যে উল্লিখিত হিসাবে, ওয়াইল্ডকার্ডগুলি কেবল উদ্ধৃত না হলেই প্রসারিত *হবে, আপনার এটিকে উদ্ধৃতিগুলির বাইরে সরিয়ে নেওয়া দরকার । আপনি যদি এর আগে গ্লোব্বিং নিষ্ক্রিয় করে থাকেন তবে আপনাকে এই আদেশটি কল করার আগে set -fএটি পুনরায় ইনস্টল করতে হবে set +f

এটি লেখার আরও ভাল উপায় হ'ল:

cd dest_folder &&
  for folder in */;do
    mv -- "${folder}data/"* "$folder"
  done

কয়েকটি নোট যদিও:

  • এটি লুকানো ফোল্ডারগুলি বাদ দেবে এবং dataফোল্ডারগুলি থেকে লুকানো ফাইলগুলি সরবে না ।
  • প্রক্রিয়াটিতে ফাইলগুলি ওভাররাইড হওয়া আমরা পরীক্ষা করছি না (আপনি -iবিকল্পটি যুক্ত করতে পারেন mv) to
  • ব্যবহার করে */, আমরা কেবল ডিরেক্টরিগুলি লুপ করছি , তবে এটিতে ডিরেক্টরিতে প্রতীকী লিঙ্কগুলিও অন্তর্ভুক্ত রয়েছে। আপনি যদি না চান তবে আপনাকে [ -L "${folder%/}" ] && continueলুপের ভিতরে একটি অংশ যুক্ত করতে হবে ।
  • যদি কোনও অ-গোপন ফোল্ডার না থাকে */তবে এটি নিজের মধ্যে প্রসারিত হবে, সুতরাং আপনি mvএটির থেকে কোনও ত্রুটি বার্তা পেয়ে যাবেন যাতে এটি একটি ফাইল খুঁজে পায় না */data/*। একইভাবে, যদি কোনও ফোল্ডারে কোনও গোপনীয় ফাইল না থাকে তবে আপনি একটি ত্রুটি বার্তা পাবেন যা that-folder/data/*বিদ্যমান নেই।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.