আমি কীভাবে ফাইলগুলি সন্ধান করতে পারি এবং সেগুলি সরাতে xargs ব্যবহার করব?


28

আমি কিছু ফাইল সন্ধান করতে চাই এবং তারপরে সেগুলি সরাতে চাই।

আমি ফাইলটি এটির সাথে খুঁজে পেতে পারি:

$ find /tmp/ -ctime -1 -name x*

আমি এগুলি তাদের সাথে আমার ~/playডিরেক্টরিতে স্থানান্তরিত করার চেষ্টা করেছি :

$ find /tmp/ -ctime -1 -name x* | xargs mv ~/play/

কিন্তু এটি কার্যকর হয়নি। স্পষ্টতই এমভিতে দুটি আর্গুমেন্ট দরকার।
নিশ্চিত (আপনি কীভাবে) এমভি কমান্ডে 'বর্তমান আইটেম' কে রেফারেন্স করবেন কিনা?


3
কেন? আপনি এর সাথে স্থানধারকটি ব্যবহার করতে পারেন -I: find . | xargs -I'{}' mv '{}' ~/play/তবে মানুষ যেমন বলে, "প্রয়োগ করে -xএবং -L 1।" সুতরাং কোনও লাভ নেই। এটিকে সহজ রাখা এবং ব্যবহার করা ভালfind . -exec mv '{}' ~/play/ \;
ম্যান্যাটওয়ার্ক

আপনি যদি কিছু মনে না করেন তবে ভোটগুলি দেখতে উত্তর হিসাবে পোস্ট করুন :)
মাইকেল ডুরান্ট

কেবল আপনার কারণ জিজ্ঞাসা করেছি, আমার যেমন অনুভূতি হয়েছিল আমি পয়েন্টটি পাইনি। যদি দ্রা স্লোয়ান অন্তর্ভুক্ত বিকল্পগুলিতে নোটটি যুক্ত করে, তার উত্তর আমি যতটা লিখতে পারি তত ভাল হবে। আরও ভাল যে সাথে যেতে।
manatwork


@ মান্যাট ওয়ার্ক আমি আমার উত্তর সম্পাদনা করেছি এই পয়েন্টগুলি
অদ্ভুতভাবে

উত্তর:


43

সর্বোত্তম পদ্ধতির জন্য স্টিফেনের উত্তরটি দেখুন, আরও সুস্পষ্ট সমাধান (এবং কেন তারা সবচেয়ে দক্ষ না হওয়ার কারণ) ব্যবহার না করার কারণে আমার উত্তরটি একবার দেখুন।

আপনি এর -Iবিকল্পটি ব্যবহার করতে পারেন xargs:

find /tmp/ -ctime -1 -name "x*" | xargs -I '{}' mv '{}' ~/play/

কোনটি একটি অনুরূপ প্রক্রিয়া কাজ করে findএবং {}। আমি আপনার -nameযুক্তিও উদ্ধৃত করব (কারণ xবর্তমান ডিরেক্টরিতে শুরু হওয়া কোনও ফাইল ফাইল-গ্লোবেড হবে এবং এটি অনুসন্ধানের জন্য একটি আর্গুমেন্ট হিসাবে পাস হবে - যা প্রত্যাশিত আচরণ দেয় না!)।

যাইহোক, ম্যানটওয়ার্ক দ্বারা চিহ্নিত হিসাবে, xargsম্যান পৃষ্ঠাতে বিস্তারিত :

   -I replace-str
          Replace occurrences of replace-str in the initial-arguments with
          names read from standard input.  Also, unquoted  blanks  do  not
          terminate  input  items;  instead  the  separator is the newline
          character.  Implies -x and -L 1.

গুরুত্বপূর্ণ বিষয়টি লক্ষণীয় হ'ল এর -L 1অর্থ হল যে একবারে কেবলমাত্র এক লাইন আউটপুট findপ্রক্রিয়া করা হবে। এর অর্থ এটি সিন্টেক্সিকভাবে একই রকম:

find /tmp/ -ctime -1 -name "x*" -exec mv '{}' ~/play/

(যা প্রতিটি ফাইলের mvজন্য একটি একক অপারেশন চালায় )।

এমনকি জিএনইউ -0xargs আর্গুমেন্ট এবং যুক্তি ব্যবহার করা find -print0ঠিক একই আচরণের কারণ ঘটায় -I- এটি clone()প্রতিটি ফাইলের প্রক্রিয়াতে হয় mv:

find . -name "x*" -print0 | strace xargs -0 -I '{}' mv '{}' /tmp/other

.
.
read(0, "./foobar1/xorgslsala11\0./foobar1"..., 4096) = 870
mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =     0x7fbb82fad000
open("/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26066, ...}) = 0
mmap(NULL, 26066, PROT_READ, MAP_SHARED, 3, 0) = 0x7fbb82fa6000
close(3)                                = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,         child_tidptr=0x7fbb835af9d0) = 661
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 661
--- SIGCHLD (Child exited) @ 0 (0) ---
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,         child_tidptr=0x7fbb835af9d0) = 662
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 662
--- SIGCHLD (Child exited) @ 0 (0) ---
.
.
.

এটি ধরে নিয়েছে যে ফাইলের নামগুলিতে নিউলাইন, একক উদ্ধৃতি, ডাবল উদ্ধৃতি বা ব্যাকস্ল্যাশ অক্ষর নেই।
স্টাফেন চেজেলাস

17

জিএনইউ সরঞ্জাম সহ:

find /tmp/ -ctime -1 -name 'x*' -print0 |
  xargs -r0 mv -t ~/play/

-t( --target) বিকল্প গনুহ নির্দিষ্ট। -print0, -r, -0, যখন অ-মানক এবং গনুহ মধ্যে উদ্ভব কিছু BSD গুলোর মত কিছু অন্যান্য বাস্তবায়নের পাওয়া যায়।

POSIXly:

find /tmp/ -ctime -1 -name 'x*' -exec sh -c '
  exec mv "$@" ~/play/' sh {} +

উভয়ই mvপ্রয়োজনীয় হিসাবে কম কমান্ড চালায় এবং ফাইলের নামগুলিতে যে কোনও অক্ষর থাকতে পারে তা নিয়ে কাজ করে। প্রথম ব্যাচটি স্থানান্তরিত করার findসময় জিএনইউর একটির সুবিধা থাকতে পারে যা ফাইলগুলি সন্ধান করে mv

সাবধান হন যে সমস্ত ফাইল এবং ডিরেক্টরিগুলি একটি ডিরেক্টরিতে শেষ হয়ে যায়, বিভিন্ন ডিরেক্টরিতে যদি বেশ কয়েকটি ফাইলের একই নাম থাকে তবে সংঘর্ষ থেকে সাবধান থাকুন।


এই সমাধানটি আরও ভাল পারফরম্যান্স, যেহেতু এটি mvএকবারে সমস্ত যুক্তির জন্য (বা সমস্ত সরবরাহ করা হয় -Lবা -nসরবরাহ করা হয়) জন্য কল করে। অন্যথায়, mvপ্রতিটি ফাইলের জন্য কল করা দ্রুত পুরানো (এবং ধীর) হয়ে উঠবে।
r2evans

1

সম্ভবত এই আদেশ এখনই সম্ভব হয়েছে এবং ২০১৩ সালে ফিরে আসেনি, তবে এটি আমার পক্ষে নিখুঁতভাবে কাজ করে:

ls pattern* | xargs mv -t DESTINATION/

-tকীটি গন্তব্য ফোল্ডারটি প্রথমে রাখে, কেবল mvফাইলগুলি সরানোর জন্য সমস্ত শেষ আর্গুমেন্ট রাখার জন্য কমান্ড মুক্ত করে ।


1
এটি ছিল আমার পক্ষে সহজ সমাধান
ptetteh227

0

আপনি নীচের কমান্ড এবং পরীক্ষিত এবং এটি কার্যকর কাজ করে চেষ্টা করতে পারেন

find /tmp/ -ctime -1 -type f -name "x*" -exec mv -t ~/play/ {} \;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.