কিভাবে একটি ফোল্ডারে প্রতি 4 র্থ ফাইল অনুলিপি করতে হয়


15

আমার মতো ফোল্ডারে প্রচুর ফাইল রয়েছে 00802_Bla_Aquarium_XXXXX.jpg। এখন আমাকে প্রতিটি চতুর্থ ফাইল একটি সাবফোল্ডারে অনুলিপি করে বলতে হবে selected/

00802_Bla_Aquarium_00020.jpg <= this one
00802_Bla_Aquarium_00021.jpg
00802_Bla_Aquarium_00022.jpg
00802_Bla_Aquarium_00023.jpg
00802_Bla_Aquarium_00024.jpg <= this one
00802_Bla_Aquarium_00025.jpg
00802_Bla_Aquarium_00026.jpg
00802_Bla_Aquarium_00027.jpg
00802_Bla_Aquarium_00028.jpg <= this one
00802_Bla_Aquarium_00029.jpg

আমি এটা কিভাবে করবো?


আপনি এর কিছু আউটপুটে superuser.com/q/396536/87552 এর সমাধানগুলির মতো করতে সক্ষম হতে পারেন ls। এছাড়াও stackoverflow.com/q/4553751/789593 দেখুন যা প্রতিটি দ্বিতীয় লাইনের বিষয়ে জিজ্ঞাসা করে।
এনএন

যদি তাদের নম্বর দেওয়া হয় এবং আপনি সর্বশেষ নম্বরটি জানেন তবে আপনি হয়ত for n in $(seq -w 20 4 200); do cp "00802_..._00${n}" ...; done
তারতম্যটি

উত্তর:


12

Zsh সহ, আপনি এটি করতে পারেন:

n=0; cp 00802_Bla_Aquarium_?????.jpg(^e:'((n++%4))':) /some/place

POSIXly, একই ধারণা, আরও কিছুটা ভার্বোস:

# put the file list in the positional parameters ($1, $2...).
# the files are sorted in alphanumeric order by the shell globbing
set -- 00802_Bla_Aquarium_?????.jpg

n=0
# loop through the files, increasing a counter at each iteration.
for i do
  # every 4th iteration, append the current file to the end of the list
  [ "$(($n % 4))" -eq 0 ] && set -- "$@" "$i"

  # and pop the current file from the head of the list
  shift
  n=$(($n + 1))
done

# now "$@" contains the files that have been appended.
cp -- "$@" /some/place

যেহেতু এই ফাইলের নামগুলিতে কোনও ফাঁকা বা ওয়াইল্ডকার্ডের অক্ষর নেই, আপনি এটিও করতে পারেন:

cp $(printf '%s\n' 00802_Bla_Aquarium_?????.jpg | awk 'NR%4 == 1') /some/place

আপনি কি দয়া করে পোস্টিক্স কোডটিতে মন্তব্য করতে পারেন
রাহুল পাতিল

@ ক্রিসডাউন, for i doস্ট্যান্ডার্ড এবং প্রকৃতপক্ষে আরও পোর্টেবল for i; doএবং এটি অবস্থানগত পরামিতিগুলি লুপ করার প্রচলিত উপায়।
স্টাফেন চেজেলাস

7

ব্যাশে, একটি মজার সম্ভাবনা, এটি এখানে বরং ভাল কাজ করবে:

cp 00802_Bla_Aquarium_*{00..99..4}.jpg selected

এটি অবশ্যই সংক্ষিপ্ত এবং সবচেয়ে দক্ষ উত্তর: কোনও সাবশেল, কোনও লুপ, কোনও পাইপ, কোনও awkওয়ার্ডের বাহ্যিক প্রক্রিয়া নয়; একটি মাত্র কাঁটাচামচ cp(যে আপনি যেভাবেই এড়াতে পারবেন না) এবং একটি ব্যাশ ধনুর্বন্ধনী প্রসার এবং গ্লোব (যে আপনার কাছে কতগুলি ফাইল রয়েছে তা আপনি জানেন যে আপনি পুরোপুরি মুক্তি পেতে পারেন)।


4
… এবং 2 অনুমান: ফাইলগুলি অবিচ্ছিন্নভাবে গণনা করা হয় এবং প্রথমটি 4 দিয়ে বিভাজ্য হয়
17:38

@ মান্ট ওয়ার্ক কোনও সমস্যা নেই যদি প্রথমটি 4 দ্বারা বিভাজ্য না হয়: যেমন, cp 00802_Bla_Aquarium_*{03..99..4}.jpg selectedআপনি যদি চান 3 mod 4। (আমি চমত্কার সত্যটি ব্যবহার করছি যে 100 দ্বারা 4 দ্বারা বিভাজ্য)। এখন, ধারাবাহিকভাবে সংখ্যাযুক্ত ফাইলগুলি সম্পর্কে, অন্যান্য সমস্ত উত্তর একই ধরণের ume
gniourf_gniourf

অন্যান্য উত্তর কোন একটানা সংখ্যায়ন ধরে? আমি কেবল উলরিচ শোয়ার্জের মন্তব্য পেয়েছি এবং এর মতো কোনও উত্তর নেই।
manatwork

5

কেবল বাশ দিয়ে, আপনি এটি করতে পারেন:

n=0
for file in ./*.jpg; do
   test $n -eq 0 && cp "$file" selected/
   n=$((n+1))
   n=$((n%4))
done

প্যাটার্নটি ./*.jpgব্যাশ ম্যান দ্বারা বর্ণিত ফাইলের নামের বর্ণ অনুসারে বাছাই করা তালিকা দ্বারা প্রতিস্থাপন করা হবে, সুতরাং এটি আপনার উদ্দেশ্য অনুসারে মাপসই করা উচিত।


ব্যাশ সালে ভিতরে আপনার তিনটি লাইন forলুপ শুধু এই লাইন দিয়ে প্রতিস্থাপিত হতে পারে: (((++n)%4)) || cp "$file" selected/;-)। সমস্যাটি হ'ল আপনি প্রতিটি ফাইলের cpজন্য একটি তৈরি করছেন যা সত্যই কার্যকর নয়।
gniourf_gniourf

1

আপনি যদি rubyইনস্টল করে থাকেন তবে নীচের ওয়ান-লাইনারটি ব্যবহার করতে পারেন। নোট করুন যে এটি ধরে নেওয়া হয়েছে যে নির্বাচিত ডিরেক্টরিটি বিদ্যমান।

ruby -rfileutils -e 'files = Dir.glob("*.jpg").each_slice(4) { |file| FileUtils.cp(file.first, "selected/" + file.first) }'

এটি বর্তমান ডিরেক্টরিতে .jpg এক্সটেনশন সহ সমস্ত ফাইলের একটি তালিকা নেয় এবং এটি চারটি উপাদানের তালিকায় টুকরো টুকরো করে এবং বর্তমান ডিরেক্টরিতে নির্বাচিত ডিরেক্টরিতে এই জাতীয় তালিকা থেকে প্রথম উপাদানটি অনুলিপি করে।


1

আপনি যদি জানেন যে আপনার ফাইলের নামগুলিতে নতুন লাইন থাকবে না, আপনি ব্যবহার করতে পারেন:

find . -maxdepth 1 -name "*.jpg" | sort | while IFS= read -r file; do
  cp "$file" selected/
  IFS= read -r; IFS= read -r; IFS= read -r
done

@ গিলস: সম্পাদনার জন্য ধন্যবাদ। আমি 3 টি পঠন করে ফাইলের ভেরিয়েবলটি সরিয়েছি, যদিও আমি উল্লেখ করতে চাই যে তাদের প্রয়োজন নেই।
jfg956

1

আপনি একটি জিইউআই ফাইল ম্যানেজার ব্যবহার করতে পারেন এবং প্রতি 5 টি ফাইল একটি সারি দখল না করা অবধি উইন্ডোর সীমানাকে পুনরায় আকার দিতে পারেন এবং তারপরে প্রথম কলামটি নির্বাচন করতে মাউস ব্যবহার করুন ...


-1

@NN উল্লিখিত হিসাবে স্ট্যাকওভারফ্লো.com/q/4553751/789593 যা প্রতি সেকেন্ডের অনুলিপি করার জন্য একটি সমাধান সরবরাহ করে তা খুব সহজ সমাধান হ'ল:

  • প্রারম্ভিক ফোল্ডার থেকে প্রথম ফাইলটি সরান
  • প্রথম ফোল্ডার থেকে মধ্যবর্তী ফোল্ডারে প্রতি সেকেন্ডে অনুলিপি করুন
  • মধ্যবর্তী ফোল্ডার থেকে প্রতিটি সেকেন্ডকে চূড়ান্ত ফোল্ডারে কপি করুন
  • ম্যানুয়ালি প্রথম ফাইল যুক্ত করুন

এটি খুব কার্যকর নাও হতে পারে কারণ এটির জন্য অতিরিক্ত কপি স্টেপ বিটের প্রয়োজন এটি করা খুব সহজ হওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.