Cum se împart fișierele cu nume numerice? (Unix, Linux, Split, Cuvinte)

Adel M. a intrebat.
a intrebat.

Încerc să împart un fișier text în fișiere de 1024 de linii, așa că am rulat split cu ajutorul comenzii -d switch:

split -d -l 300 ./list.lst

Primesc niște nume ciudate: încep cu x iar numele fișierelor sar de la x89 la x9000. Vreau ca fișierele să fie denumite astfel:

1.lst
2.lst
3.lst
...

Mulțumesc.

2 răspunsuri
steeldriver

Cel puțin cu versiunea GNU Coreutils a lui split, puteți face acest lucru după cum urmează:

split -l300 --numeric-suffixes=1 --suffix-length=1 --additional-suffix=".lst"  file ""

Rețineți utilizarea lui "" pentru a specifica un prefix gol (prefixul xa parte a numelui de fișier implicit) și utilizarea lui --numeric-suffixes în locul lui -d (care începe întotdeauna de la 0).

Rețineți, de asemenea, că acest lucru presupune că fișierul care urmează să fie divizat nu conține mai mult de 9 x 300 linii – în caz contrar split se va plânge că output file suffixes exhausted

Ex.

$ split -l300 --numeric-suffixes=1 --suffix-length=1 --additional-suffix=".lst" --verbose file ""
creating file '1.lst'
creating file '2.lst'
creating file '3.lst'
creating file '4.lst'

Comentarii

  • Cu --suffix-length=1 este posibil să se creeze doar 9 părți (1-9). Utilizatorul creează mai mult de 89 de părți (pentru că raportează numele de fișier ca x9000). Deci, lungimea ar trebui să fie de cel puțin 3 (sau mai mult). –  > Por Isaac.
Isaac

Încercați acest lucru:

 split --additional-suffix='.lst' -da3 -l 1024 list.lst ''

Motivul pentru care s-a sărit la 9000 (pentru mai mult de 89 de părți) este că lungimea numerică implicită este 2.

Modificați cu -a opțiunea . Pentru a vă asigura că numerotarea fișierelor rămâne numerică (și este monotonă (crește întotdeauna)), utilizați o lungime mai mare decât valoarea maximă pe care o are numărul posibil de diviziuni.

 $ split -a 3 -d -l1024 ./list.lst

 $ ls
 list.lst  x009  x019  x029  x039  x049  x059  x069  x079  x089  x099  x109  x119
 x000      x010  x020  x030  x040  x050  x060  x070  x080  x090  x100  x110  x120
 x001      x011  x021  x031  x041  x051  x061  x071  x081  x091  x101  x111  x121
 x002      x012  x022  x032  x042  x052  x062  x072  x082  x092  x102  x112  x122
 x003      x013  x023  x033  x043  x053  x063  x073  x083  x093  x103  x113  x123
 x004      x014  x024  x034  x044  x054  x064  x074  x084  x094  x104  x114  x124
 x005      x015  x025  x035  x045  x055  x065  x075  x085  x095  x105  x115  x125
 x006      x016  x026  x036  x046  x056  x066  x076  x086  x096  x106  x116  x126
 x007      x017  x027  x037  x047  x057  x067  x077  x087  x097  x107  x117  x127
 x008      x018  x028  x038  x048  x058  x068  x078  x088  x098  x108  x118

Pentru a modifica valoarea x, trebuie doar să modificați opțiunea PREFFIX (implicit x) (după numele fișierului):

 split -a 3 -d -l 1024 list.lst ''

Care va denumi fișierele 000. Pentru a obține o linie de sfârșit .lst, adăugați --additional-suffix='.lst' opțiune, pe scurt, utilizați acest lucru:

 split --additional-suffix='.lst' -da3 -l 1024 list.lst ''

Dacă aveți nevoie ca valoarea numerică de început să fie 001, utilizați acest lucru:

 split --additional-suffix='.lst' --numeric-suffixes=1 -a 3 -l 1024 list.lst ''

Dar nu, nu există nici o modalitate de a obține valori numerice precum 1,2,3,…,21,…,107 fără redenumire.

Redenumirea ar putea rezolva toate problemele în doi pași cu o simplă buclă:

 split -l 1024 -d -a 8 list.lst
 for f in x[0-9]*; do
     mv "$f" "$((10#${f#x}+1)).lst"
 done