diff --git a/src/uu/split/src/split.rs b/src/uu/split/src/split.rs index d683bb34328..85bbb602050 100644 --- a/src/uu/split/src/split.rs +++ b/src/uu/split/src/split.rs @@ -1156,6 +1156,7 @@ fn n_chunks_by_line( } let mut chunk_number = 1; + let mut file_index = 0; let sep = settings.separator; let mut num_bytes_should_be_written = chunk_size_base + (chunk_size_reminder > 0) as u64; let mut num_bytes_written = 0; @@ -1176,8 +1177,7 @@ fn n_chunks_by_line( } } else { // Should write into a file - let idx = (chunk_number - 1) as usize; - let writer = out_files.get_writer(idx, settings)?; + let writer = out_files.get_writer(file_index, settings)?; custom_write_all(bytes, writer, settings)?; } @@ -1204,12 +1204,11 @@ fn n_chunks_by_line( chunk_number += 1; } - // If a chunk was skipped and `elide_empty_files` flag is set, - // roll chunk_number back to preserve sequential continuity - // of file names for files written to, - // except for Kth chunk of N mode - if settings.elide_empty_files && kth_chunk.is_none() { - chunk_number = chunk_number.min(first_chunk_number + 1); + // Keep output names consecutive without changing the chunk boundaries. + if settings.elide_empty_files { + file_index += usize::from(chunk_number > first_chunk_number); + } else { + file_index = (chunk_number - 1) as usize; } if kth_chunk.is_some_and(|k| chunk_number > k) { break; diff --git a/tests/by-util/test_split.rs b/tests/by-util/test_split.rs index fb39a91b045..9840c786e84 100644 --- a/tests/by-util/test_split.rs +++ b/tests/by-util/test_split.rs @@ -1299,6 +1299,22 @@ fn test_elide_dev_null_l_chunks() { assert!(!at.plus("xac").exists()); } +#[test] +fn test_elide_empty_files_preserves_line_chunks() { + let (at, mut ucmd) = at_and_ucmd!(); + at.write("input", "aaaaaa\nb\nc\nd\ne\n"); + ucmd.args(&["-e", "-n", "l/6", "input"]) + .succeeds() + .no_output(); + + assert_eq!(at.read("xaa"), "aaaaaa\n"); + assert_eq!(at.read("xab"), "b\n"); + assert_eq!(at.read("xac"), "c\n"); + assert_eq!(at.read("xad"), "d\n"); + assert_eq!(at.read("xae"), "e\n"); + assert!(!at.plus("xaf").exists()); +} + #[test] #[cfg(unix)] fn test_number_by_bytes_dev_zero() {