Qanday qilib har 4 faylni papkaga nusxalash kerak

00802_Bla_Aquarium_XXXXX.jpg deb nomlangan papkada fayllar ko'p. Keling, 4th faylini selected/ deb nomlangan bir pastki papkaga nusxalash kerak.

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

Qanday qilaman?

14
superuser.com/q/396536/87552 ba'zi chiqishi echimlari kabi bo'lishi mumkin. ls . stackoverflow.com/q/4553751/789593 saytiga qarang.
qo'shib qo'ydi muallif I. J. Kennedy, manba
Agar ular raqamlangan bo'lsa va siz oxirgi raqamni bilsangiz, siz $ (seq -w 20 4 200) ning n uchun n kodining o'zgarishini hisoblashingiz mumkin; Cp "00802 _..._ 00 $ {n}" ...; bajarilgan
qo'shib qo'ydi muallif daleif, manba

7 javoblar

Zsh bilan siz shunday qila olasiz:

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

POSIXly, xuddi shu g'oya, biroz ko'proq mantiqiy:

# 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 -- "[email protected]" "$i"

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

# now "[email protected]" contains the files that have been appended.
cp -- "[email protected]" /some/place

Ushbu fayl nomlari bo'sh yoki joker belgilarni olmaganligi uchun siz ham shunday qilishingiz mumkin:

cp $(printf '%s\n' 00802_Bla_Aquarium_?????.jpg | awk 'NR%4 == 1') /some/place
12
qo'shib qo'ydi
@ChrisDown, for i do standarti va aslida i uchun ga nisbatan ko'chma. -ni tanlang va joylashuv parametrlari bo'yicha aylantiradigan kanonik usul.
qo'shib qo'ydi muallif Stéphane Chazelas, manba
Iltimos, sharhni posix kodiga ham keltira olasizmi?
qo'shib qo'ydi muallif Rahul Patil, manba

Bashda kulgili imkoniyat, bu erda juda yaxshi ishlaydi:

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

Bu, albatta, eng qisqa va eng samarali javob: pastki chiziqli, no loop, no pipe, no awk tashqi jarayonni bajarish; cp (sizdan qochib qutula olmaysiz) va bitta bash brace kengayishi va globini (sizning qancha faylingiz borligini bilishingiz uchun butunlay qutulishingiz mumkin) faqat bir vilkalar.

6
qo'shib qo'ydi
... va 2 ta taxminlar: fayllar uzluksiz raqamlangan va birinchisi 4 bilan ajralib turadi.
qo'shib qo'ydi muallif user10412, manba
Qaysi boshqa javoblar doimiy raqamlashni nazarda tutadi? Faqatgina Ulrich Schwarzning sharhini topdik
qo'shib qo'ydi muallif user10412, manba
3 mod 4 bo'lsangiz, masalan, cp 00802_Bla_Aquarium _ * {03..99..4} .jpg tanlangan . (100ni ajratishning ajoyib haqiqatini foydalanayapman 4). Endi doimiy raqamlangan fayllar haqida boshqa barcha javoblar bir xil bo'ladi.
qo'shib qo'ydi muallif Bobby Marinoff, manba

Faqat bash bilan siz shunday qilishingiz mumkin:

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

./*. Jpg naqshini alfavit tartibida ajratilgan fayl nomlari ro'yxati o'zgartiriladi, shuning uchun siz maqsadingizga mos kelishi kerak.

5
qo'shib qo'ydi
Bashda for pastadiridagi uch qatorni faqat shu satr bilan almashtirish mumkin: (((++ n)% 4)) || CP "$ fayl" tanlangan/. ; -) . Muammo shundaki, siz har faylida cp ga ishlov berasiz.
qo'shib qo'ydi muallif Bobby Marinoff, manba

Agar fayl nomlaringizda yangi qatorlar bo'lmasa, quyidagilarni amalga oshirishingiz mumkin:

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
1
qo'shib qo'ydi
@Gilles: tahrirlash uchun rahmat. Fayl o'zgaruvchisini 3 o'qishda o'chirib qo'ydim, chunki ular kerak emasligini ta'kidlamoqchiman.
qo'shib qo'ydi muallif Guerry, manba

Stackoverflow.com/q/4553751/789593 sahifasiga qaraydigan bo'lsak, har bir sonni nusxa ko'chirish uchun @ N.N. juda oddiy bir yechim bo'lardi:

  • Birinchi faylni boshlang'ich papkadan
  • olib tashlang
  • Boshlang'ich papkadan har bir sonni qidiruv papkaga nusxalash
  • Har bir soniyani qidiruv papkadan oxirgi jildga nusxa ko'chiring
  • Birinchi faylni qo'lda qo'shish

Bu juda ham foydali bo'lmasligi mumkin, chunki qo'shimcha nusxa ko'chirish jarayoni juda oson bo'lishi kerak.

1
qo'shib qo'ydi

Agar sizda ruby ​​ o'rnatilgan bo'lsa, siz quyidagi bitta liniyani ishlatishingiz mumkin. Tanlangan katalog mavjudligini ta'kidlaydi.

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

Joriy papkada kengaytma .jpg faylining barcha fayllari ro'yxatini oladi va ularni to'rt elementlarning ro'yxatlariga bo'linadi va har bir ro'yxatdagi birinchi elementni joriy katalogda tanlangan katalogga ko'chiradi.

0
qo'shib qo'ydi

Siz GUI fayli menejeridan foydalansangiz va har 5 ta fayl bir qatorni egallab turguncha oyna oynasining chegarasini o'zgartirasiz, so'ngra birinchi ustunni tanlash uchun sichqondan foydalaning ...

0
qo'shib qo'ydi