Commande split de Linux
splitsplit est un outil de découpage de fichiers intégré à Linux qui peut découper un fichier par nombre de lignes, taille ou quantité spécifiée.
splitLa commande est utilisée pour découper un gros fichier en plusieurs fichiers plus petits, ce qui facilite le transfert, le stockage ou le traitement en parallèle.
Les fichiers découpés peuvent être réassemblés à l'aide de lacatcommande pour les remettre dans le fichier d'origine.
Lorsque les fichiers journaux sont trop volumineux pour être ouverts avec un éditeur, lorsqu'un fichier volumineux doit être téléversé par morceaux, ou lorsque les données doivent être traitées en parallèle,splitsplit est la solution.
Les fichiers découpés sont nommés par défaut avecxaa、xab、xacet d'autres séquences alphabétiques.
splitsplit ne supprime ni ne modifie le fichier d'origine, l'opération de découpage est donc sûre. Toutefois, lorsque vous découpez en de nombreux petits fichiers, assurez-vous de disposer de suffisamment d'espace disque.
Syntaxe de la commande
splitLa syntaxe de base de split est la suivante :
split [选项] [输入文件] [输出文件前缀]
Si aucun fichier d'entrée n'est spécifié, les données sont lues depuis l'entrée standard.
Si aucun préfixe de fichier de sortie n'est spécifié, le préfixe par défaut estxutilisé.
splitLes options courantes de split sont listées ci-dessous :
| Option | Description | Exemple |
|---|---|---|
-b, --bytes=大小 | Découper le fichier selon le nombre d'octets spécifié | split -b 100M large.log |
-l, --lines=行数 | Découper le fichier selon le nombre de lignes spécifié | split -l 1000 data.txt |
-n, --number=数量 | Découper en le nombre spécifié de petits fichiers | split -n 5 data.txt |
-a, --suffix-length=N | Spécifier la longueur du suffixe (par défaut : 2) | split -a 3 -l 100 data.txt |
-d, --numeric-suffixes | Utiliser des suffixes numériques au lieu de suffixes alphabétiques | split -d -l 100 data.txt |
-C, --line-bytes=大小 | Découper par taille tout en gardant chaque ligne complète | split -C 10M log.txt |
--verbose | Afficher des informations détaillées sur le processus de découpage | split --verbose -b 10M file.bin |
Les unités de taille prises en charge incluent :K(KB),M(MB)、G(GB)、T(TB) et autres suffixes.
Différence entre -b et -C :
| Option | Comportement | Scénario d'application |
|---|---|---|
-b | Coupe strictement selon le nombre d'octets et peut tronquer au milieu d'une ligne | Fichiers binaires ou scénarios où les sauts de ligne n'ont pas d'importance |
-C | Tente de couper aux limites de ligne lorsqu'il atteint la limite de taille, en veillant à ce que chaque ligne soit complète | Journaux texte, CSV et autres scénarios où les lignes doivent rester intactes |
Lors de la division de fichiers texte, privilégiez
-Cover-bpour éviter qu'une ligne soit coupée et répartie entre deux fichiers.
Utilisation détaillée
Diviser par nombre de lignes
La division par nombre de lignes est la méthode la plus intuitive et convient au traitement de fichiers journaux ou de données CSV.
# 生成一个包含 5000 行的测试文件 $ seq 1 5000 > data.txt # 每 1000 行拆分为一个小文件 $ split -l 1000 data.txt part_ # 查看生成的文件 $ ls -lh part_* -rw-r--r-- 1 example example 3.9K May 19 14:30 part_aa -rw-r--r-- 1 example example 3.9K May 19 14:30 part_ab -rw-r--r-- 1 example example 3.9K May 19 14:30 part_ac -rw-r--r-- 1 example example 3.9K May 19 14:30 part_ad -rw-r--r-- 1 example example 3.9K May 19 14:30 part_ae
Après exécution, 5 fichiers sont générés, chacun avec exactement 1000 lignes, et les noms de fichiers utilisentpart_comme préfixe.
Diviser par taille de fichier
La division par taille convient pour découper des fichiers binaires ou limiter la taille maximale d'un seul fichier.
# 生成一个 10MB 的测试文件 $ dd if=/dev/urandom of=test.bin bs=1M count=10 # 按每 2MB 拆分 $ split -b 2M test.bin chunk_ # 查看拆分结果 $ ls -lh chunk_* -rw-r--r-- 1 example example 2.0M May 19 14:32 chunk_aa -rw-r--r-- 1 example example 2.0M May 19 14:32 chunk_ab -rw-r--r-- 1 example example 2.0M May 19 14:32 chunk_ac -rw-r--r-- 1 example example 2.0M May 19 14:32 chunk_ad -rw-r--r-- 1 example example 2.0M May 19 14:32 chunk_ae
Spécifier le nombre de divisions
Utiliser-npour diviser le fichier uniformément en le nombre spécifié de petits fichiers.
# 将文件均分为 3 份 $ split -n 3 data.txt equal_ # 查看各文件行数 $ wc -l equal_* 1667 equal_aa 1667 equal_ab 1666 equal_ac 5000 total
Le fichier est réparti aussi uniformément que possible ; un fichier totalisant 5000 lignes est divisé en environ 1667 lignes par fichier.
Lorsque le nombre total de lignes n'est pas divisible de manière égale, les premiers fichiers obtiennent quelques lignes en plus et les derniers fichiers en obtiennent quelques-unes en moins.
Utiliser des suffixes numériques
Le suffixe alphabétique par défaut (aa、ab...) n'est pas assez intuitif ; vous pouvez utiliser-dpour passer aux suffixes numériques.
# 使用数字后缀,并指定后缀长度为 3 $ split -d -a 3 -l 1000 data.txt example_ # 生成的文件名 $ ls example_* example_000 example_001 example_002 example_003 example_004
Ici, une longueur de suffixe de 3 signifie que jusqu'à 1000 fichiers sont pris en charge (de 000 à 999). Lors du découpage en de nombreux petits fichiers, vous pouvez augmenter la valeur de-al'option.
Découper le texte tout en préservant l'intégrité des lignes
Utiliser-Cpour découper selon la taille tout en veillant à ce qu'aucune ligne ne soit tronquée.
# 生成一个包含不同长度行的测试日志 $ for i in $(seq 1 100); do echo "Line $i: EXAMPLE testing data $(head -c $((RANDOM % 50 + 10)) /dev/urandom | base64)"; done > log.txt # 按 1KB 拆分,同时保持行完整性 $ split -C 1K log.txt log_ # 检查每个文件的最后一行是否完整(都以换行符结尾) $ for f in log_*; do echo "$f: $(tail -c 1 $f | xxd | grep -c '0a')"; done
-CCela garantit que la dernière ligne de chaque fichier découpé est complète, et que les lignes ne sont jamais coupées en deux.
Fusionner les fichiers découpés
Les fichiers découpés peuvent être fusionnés sans perte pour restaurer le fichier d'origine :
# 合并所有拆分文件,还原为原始文件 $ cat part_* > restored.txt # 验证合并后的内容与原始文件一致 $ diff data.txt restored.txt && echo "文件一致,合并成功" 文件一致,合并成功
Lors de la fusion,catcat les concatène dans l'ordre alphabétique de l'expansion des jokers du shell, ce qui est exactement l'splitordre dans lequel split génère les fichiers.
FAQ
Les fichiers découpés occupent toujours le même espace disque total que le fichier d'origine (en fait, il y a un certain surcoût de métadonnées du système de fichiers), donc assurez-vous qu'il y a suffisamment d'espace disque libre.
Lors de l'utilisation de suffixes numériques, si le nombre de fichiers découpés dépasse le maximum représentable par la longueur du suffixe (par ex.,
-a 2jusqu'à 100 fichiers),splitsplit se terminera avec une erreur. Augmentez la valeur du-aparamètre pour corriger cela.
Si vous devez découper selon un contenu spécifique (comme par un délimiteur),splitsplit ne le prend pas en charge ; utilisez lacsplitcommande csplit à la place.
Lors de la lecture de données depuis l'entrée standard,splitsplit ne peut pas estimer la taille totale, donc l'-noption permettant de spécifier le nombre de découpages ne prend pas en charge le mode d'entrée standard.
Commandes associées
| Commande | Description |
|---|---|
cat | Fusionner des fichiers ou afficher le contenu de fichiers |
csplit | Diviser des fichiers par contenu (expression régulière) |
wc | Compter les lignes, les mots et les octets dans un fichier |
dd | Convertir et copier des fichiers, et extraire des données par taille de bloc |
head | Afficher le début d'un fichier |
tail | Afficher la fin d'un fichier |
Référence des commandes Linux