যে ফাইলগুলি লেখা হচ্ছে সেগুলি বাদ দিয়ে কোনও ফোল্ডারে সমস্ত ফাইল কীভাবে অনুলিপি করবেন?


12

আমি HTTPie এরdownloading মাধ্যমে একটি ফোল্ডারে একাধিক ফাইল ডাউনলোড করি । একটি বাশ স্ক্রিপ্ট লক্ষ্য করা হয়েছে ডাউনলোড করা ফাইলগুলি প্রক্রিয়া করা এবং আমি ডাউনলোড করা ফাইলগুলি অন্য ফোল্ডারে হিসাবে অনুলিপি করার চেষ্টা করেছি

find /folder/downloading -type f -exec mv '{}' /folder/downloaded \;

তবে এটি ফাইলগুলিও অনুলিপি করে, যা এখনও শেষ হয়নি। -mmin +5কমান্ডটিতে যুক্ত করে পুরানো ফাইলগুলিতে স্থানান্তর সীমাবদ্ধ করার চেষ্টা করেছি । কেবল ফাইলগুলি রচনা করা এবং ডাউনলোড করা ফাইল স্থানান্তর করার দক্ষ আদেশটি কী?


যদি একই ফাইল সিস্টেমে অনুলিপি করা হয়, এবং আপনি নাম পরিবর্তন না করার জন্য ডাউনলোডার সেট করেছেন ( %.partতারপরে পুনরায় নামকরণ% এ ডাউনলোড করুন )। তারপরে যদি ডাউনলোডারটি ভাল আচরণ করে (অন্য কিছু করার মতো না) তবে আপনার mvফাইলগুলির নাম পরিবর্তন করতে সক্ষম হওয়া উচিত ।
ctrl-alt-delor

1
আপনি কোন ধরণের প্রসেসিংয়ের চেষ্টা করছেন? পাইপলাইন ব্যবহার করার মতো অনেকগুলি সহজ বিকল্প উপলব্ধ।
বাগান মাথ

উত্তর:


11

খুব দক্ষ নয়, তবে আপনি এটি করতে পারেন:

find /folder/downloading -type f -exec sh -c '
  for file do
    lsof -F a "$file" | grep -q w || mv "$file" /folder/downloaded
  done' sh {} +

যে চেক যে ফাইলটি একটি সাথে তালিকাভুক্ত নয় wআচার aমধ্যে ccess মোড lআমি sএর টন oকলম fসামনে Iles mving।

লিনাক্স-ভিত্তিক অপারেটিং সিস্টেমে সাধারণত হিসাবে দেখা যায় এর psmiscবাস্তবায়নের fuserএকটি -wকার্য রয়েছে (লেখার জন্য খোলা ফাইলগুলি পরীক্ষা করার জন্য) তবে দুর্ভাগ্যক্রমে এটি কেবলমাত্র -kসম্পর্কিত প্রক্রিয়াগুলিকে হত্যা করার জন্যই কাজ করে। তবে, মনে হচ্ছে আপনি সিউডো সিগন্যাল 0 ব্যবহার করে এটি ব্যবহার করতে পারবেন যা কিছুই করে না:

find /folder/downloading -type f -exec sh -c '
  for file do
    fuser -s -w -k -0 "$file"  || mv "$file" /folder/downloaded
  done' sh {} +

সরান -s(অথবা এমনকি সঙ্গে এটি প্রতিস্থাপন -v) আপনি তা দেখতে প্রক্রিয়া (গুলি) চান করা হয় (হয়) পদক্ষেপ প্রতিরোধ।

মনে রাখবেন যে আপনি যদি কমান্ডগুলিকে অতি-ব্যবহারকারী হিসাবে চালাচ্ছেন না, আপনি কেবল আপনার প্রক্রিয়াগুলি সম্পর্কে তথ্য পাবেন। ফাইলগুলি ডাউনলোড করার প্রক্রিয়াগুলি যদি অন্য কোনও ব্যবহারকারী হিসাবে চলমান থাকে তবে সেগুলি সনাক্ত করা যায় না।

এছাড়াও মনে রাখবেন যে আপনি ফাইলগুলিকে অন্য একটি ফাইল সিস্টেমে সরিয়ে না নিলে ফাইলগুলি সরিয়ে নেওয়া বর্তমানে ফাইলটিতে লেখার কাজ শেষ না হওয়া থেকে প্রক্রিয়াটিতে যে কোনও প্রক্রিয়া লিখছে তা প্রতিরোধ করবে না।

তবে, পরে তারা কী কী নকশাকৃত হয়েছে তার উপর নির্ভর করে তারা বিভ্রান্ত হতে পারে যদি তারা লেখার কাজ শেষ করে দেয় তবে ফাইলটি আর নেই (উদাহরণস্বরূপ যদি তারা ফাইলটি ডাউনলোড করার পরে কিছু বৈশিষ্ট্য পরিবর্তন করতে চায় এবং না করে) ফাইল বর্ণনাকারীর মাধ্যমে (যেমন chmod()বনাম fchmod(), বা utimes()যা কোনও ফাইল বর্ণনাকারীর মাধ্যমে করা যায় না)।


শেল প্রশ্ন: আমি মনে করি আমি একটি ব্যতিক্রম সহ আপনার কোডটি বুঝতে পারি। -execচলমান shএক কমান্ড (সঙ্গে -c '...') এবং {} +এটি একটি সময়ে ঐ কমান্ড মধ্যে একটির বেশি ফলাফলের লাগাতে বলে। আমি যা বুঝতে পারি না কেন হ'ল shকমান্ডের পরে আরও একটি। আমি কী মিস করছি?
জো

2
@ জো, এটাই ইনলাইন স্ক্রিপ্টের মধ্যে যায় $0। যে, এটি যে ইনলাইন স্ক্রিপ্ট একটি নাম দেয় । <name>: fuser: command not foundউদাহরণ হিসাবে উদাহরণস্বরূপ ত্রুটি বার্তাগুলিতে সেই নামটি ব্যবহার করা যেতে পারে , তাই shত্রুটি বার্তাকে কীভাবে রিপোর্ট করা হচ্ছে তা পরিষ্কার করে দেওয়ার জন্য সাধারণত এই ক্ষেত্রে একটি ভাল পছন্দ (আমরা যদি পরে কোনও যুক্তি না দিয়ে থাকি তবে এটিই হবে) ইনলাইন-স্ক্রিপ্ট)।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.