Linux komut satırı / Lexicographic sırasına göre filtrelenmiş dosyaları taşıma


4

Bir klasörde adlandırılmış bazı dosyalar var. IMG_0001.jpg ... IMG_9999.jpg. Sözlüksel olarak daha büyük bir ada sahip olan dosyaları başka bir dizine taşımak istiyorum IMG_9431.jpg Bunu nasıl yapabilirim?

Yanıtlar:


4

Kullanabilirsiniz sort ve sed Bunun gibi bazı dizgilerden daha büyük dosyaların listesini almak için:

$ ls -v
0?#Li  23?24  E.See  NULib  Yoush  ce-Su  edint  ethat  ibble  itwil  lines  of16   plesA  ryGen  t6?#C  witht  #ver
0?#mo  25?i   Examp  NYWAR  along  cribb  edist  ev     ibrar  ix B.  mapfo  ofthe  ppend  sdist  tetot  y8?#9  (atyo
0,22   27?#   FORAP  NextA  areFo  dacop  edwar  frees  ic11   lPubl  mored  oftwa  publi  sefor  theGN  yGene  )1995
1.scr  02111  Finla  Peter  aryis  datio  eful,  ftheG  ight(  landJ  mport  on23#  ralPu  se,or  tunde  yofth  ,USA.
1-200  ARTIC  GIMPT  RANTY  avere  difyi  eitan  ftwar  imbal  lbeus  ncerK  on,MA  raryG  shedb  t,wri  ytheF  ;ifno
2John  Appen  HANTA  Softw  bleof  dix B  enera  ght(C  impli  ld7?#  nc.,5  oolki  raryi  simpl  ublic  #19?#  ;with
4?#Th  BILIT  HOUTA  TNESS  blic2  e.py4  enthe  gtk26  ingar  lePla  ngpix  opyri  rdraw  sion.  ucanr  #Bost   Code
5?#GT  Backi  K-The  U17?#  brary  e.pyB  eralP  he21   ion)a  lesPr  nseas  oshMa  reeSo  sion2  undat  #Free
9Temp  Conte  Libra  ULARP  cDona  eExam  ermso  hehop  ion,I  lesTa  ntsB.  ouldh  re;yo  slibr  uropt  #Lice
13?#1  Copyr  Licen  URPOS  ceive  eFoun  erver  her12  islib  lescr  nylat  outev  ribut  s,Spe  utWIT  #MERC
15?#b  C)200  Matti  YorFI  cense  eGNUL  etail  hisli  ite33  lesim  n;eit  ple.p  rthet  s.18   vpyth  #Thi

$ mkdir greater-than-sion

İşte sihir:

$ find -type f -print0 | 
  sort -z |
  sed -z '1,/sion/d' | 
  xargs -0 mv -t greater-than-sion

Hatları:

  1. ile ayrılmış bir dosyalar listesi yazdırmak NUL newlines yerine ( -print0 )
  2. sırala
  3. satırları sil daha düşük (dahil) bazı string (burada) sion ) - Bunun sadece GNU’da çalıştığını unutmayın. sed, uygular -z ayrıştırma seçeneği NUL sonlandırılmış girdi
  4. bu listeye geçmek mv ile xargs

Ve istenen sonuç:

$ ls -R
.:
 Code  ;ifno  25?i   avere  Conte  edist  erver  GIMPT               ic11   K-The  lines  nseas  opyri  raryG  se,or
#19?#  ;with  27?#   Backi  Copyr  edwar  etail  greater-than-sion/  ight(  landJ  lPubl  ntsB.  oshMa  raryi  sefor
#Bost  0?#Li  2John  BILIT  cribb  eExam  ethat  gtk26               imbal  lbeus  mapfo  NULib  ouldh  rdraw  shedb
#Free  0?#mo  4?#Th  bleof  dacop  eFoun  ev     HANTA               impli  ld7?#  Matti  nylat  outev  re;yo  simpl
#Lice  0,22   5?#GT  blic2  datio  eful,  Examp  he21                ingar  lePla  mored  NYWAR  Peter  reeSo  sion.
#MERC  02111  9Temp  brary  difyi  eGNUL  Finla  hehop               ion)a  lescr  mport  of16   ple.p  ribut
#Thi   1.scr  along  C)200  dix B  eitan  FORAP  her12               ion,I  lesim  n;eit  ofthe  plesA  rthet
#ver   1-200  Appen  cDona  e.py4  enera  frees  hisli               islib  lesPr  nc.,5  oftwa  ppend  ryGen
(atyo  13?#1  areFo  ceive  e.pyB  enthe  ftheG  HOUTA               ite33  lesTa  ncerK  on,MA  publi  s,Spe
)1995  15?#b  ARTIC  cense  E.See  eralP  ftwar  ibble               itwil  Libra  NextA  on23#  ralPu  s.18
,USA.  23?24  aryis  ce-Su  edint  ermso  ght(C  ibrar               ix B.  Licen  ngpix  oolki  RANTY  sdist

./greater-than-sion:
sion2  Softw  t6?#C  theGN  tunde  ublic  ULARP  uropt  utWIT  witht  yGene  YorFI  ytheF
slibr  t,wri  tetot  TNESS  U17?#  ucanr  undat  URPOS  vpyth  y8?#9  yofth  Yoush

Güzel. Tamamen unuttum sed İşte.
slhck

'Sed -z' ne yapar? Hızlı bir kontrol yaptım ve -z seçeneğinin açıklamasını bulamadım.
jaychris

Satırları, yeni satır karakteri yerine boş karakterle ayırarak işler. Bu kılavuzda belirtilmiştir.
Ярослав Рахматуллин

Bunun yalnızca GNU seçeneği olduğunu ve BSD’nin olmadığını unutmayın. sed. (cc @jaychris)
slhck

Teşekkürler Ярослав & amp; slhck. Kılavuzu ve googled'i denedim ama bu seçeneği alamadım. Göründüğüm sed gibi GNU versiyonu değil.
jaychris

6

İle ayraç genişletme Bash 3 ve üzeri, Zsh ve diğer birçok mermide mevcut: *

mv IMG_{9431..9999}.jpg some_other_dir

Parantezler 9431 ile 9999 arasındaki tüm sayılara genişletilecektir, bu yüzden şunu yazmak eşdeğerdir:

mv IMG_9431.jpg IMG_9432.jpg … IMG_9999.jpg some_other_dir

Çok fazla dosya varsa bu başarısız olur (bkz. hakkında bu yazı ARG_MAX arka plan bilgisi için.)

Kabuğunuzda ayraç genişletme özellikleri yoksa veya çok fazla dosyanız varsa, bunu yapabilirsiniz - bu biraz daha yavaş olabilir:

for n in $(seq 9431 9999); do mv "IMG_$n.jpg" some_other_dir; done

Eğer gerçekten sözlükbilimi sıralamak istiyorsanız, bir göz atın Ярослав Рахматуллин'ın cevabı . Burada izlenenden çok daha iyi.

Bir şekilde dosya adlarını sıralamanız gerekecek. Çok çabuk geldiğim şey buydu ve bu pek de ideal değil. GNU / Linux ile çalışır ( grep, sort, xargs ) ve tırnak işaretleri ve boşluk dahil herhangi bir dosya adıyla ilgilenir.

tmp="$(mktemp /tmp/files.XXX)"
find . -type f -name 'IMG*'  -maxdepth 1 -print0 | sort -z > "$tmp"
line=$(grep -nz IMG_9984.jpg "$tmp" | cut -d: -f1)
tr '\0\n' '\n\0' < "$tmp" | tail -n "+$line" | tr '\0\n' '\n\0' |
xargs -0 -I{} echo mv {} some_other_dir
rm "$tmp"

Kaldır echo İstediğin şeyi yaptığına emin olduğun zaman. Burada ne yapıyoruz:

  • Dosya adlarını tutmak için geçici bir dosya oluşturun.

  • Desene uyan tüm dosyaları bulun ve bunları geçici bir dosyaya yerleştirin. Kayıtlar ile sınırlandırılmış NUL karakter ( -print0, -z ) herhangi bir dosya adıyla başa çıkabiliriz.

  • Dosya adının "satır" numarasını bulun, ör. IMG_9984.jpg

  • takas NUL ve geçici dosyadaki newline yani tail onunla baş edebilir .

  • Onları geri değiştir. xargs başa çıkabilirim ( -0 ) ve mv dosyaları diğer dizine.

Tırnak veya boşluk içeren dosyalar ile uğraşmak zorunda kalmazsak bu daha kolay olurdu, ama… bu sadece benim. Üzülmektense tedbirli olmak iyidir.


Belki de Bash'in kendine özgü (?) Olduğuna dikkat edin. Daha egzotik bir not, toplamda ARG_MAX argümanlarından daha fazlasına genişlemesi durumunda başarısız olacağıdır. Yine de bu durumda kaçınılması gereken bir kaç büyük emir var.
Daniel Andersson

@DanielAndersson Eski / alternatif mermiler için bir çözüm ekleyecektim. Bash 3 ve üzeri, ayrıca Zsh ve ksh'da, belki başkalarında.
slhck

Sadece bilgi için, eğer dosyalarda bir desen olmasaydı ve sadece belirli bir dosya adından "sözlüksel olarak daha büyük" tüm dosyaları almak isterdim?
Paralife

@Paralife Zor olabilir - güncellenmiş cevabımı gör. Ancak Ярослав'ın çözümü kesinlikle daha kolay.
slhck

tamam burada ne var? Ярослав'ın diğer durumlar için de yararlı olabilecek daha genel bir çözüme kabul edilmiş bir cevap verin veya sorduğum ve daha basit olan soruya cevap verdiği için bu kabul edilen cevabı bırakın.
Paralife
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.