Skip to content
48 changes: 48 additions & 0 deletions implement-shell-tools/cat/cat.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { readFile } from "node:fs/promises";
import process from "node:process";

const argv = process.argv.slice(2);

let showLineNumbers = false;
let numberNonBlankLines = false;
const files = [];

for (const arg of argv) {
if (arg === "-n") {
showLineNumbers = true;
} else if (arg === "-b") {
numberNonBlankLines = true;
} else {
files.push(arg);
}
}

let lineNumber = 1;

for (const file of files) {
try {
const content = await readFile(file, "utf-8");

const lines = content.split("\n");

if (numberNonBlankLines) {
for (const line of lines) {
if (line !== "") {
console.log(`${lineNumber} ${line}`);
lineNumber++;
} else {
console.log("");
}
}
} else if (showLineNumbers) {
for (const line of lines) {
console.log(`${lineNumber} ${line}`);
lineNumber++;
}
} else {
process.stdout.write(content);
}
} catch (err) {
console.error(err.message);
}
}
51 changes: 51 additions & 0 deletions implement-shell-tools/ls/ls.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { readdir, stat } from "node:fs/promises";
import process from "node:process";

const argv = process.argv.slice(2);

let onePerLine = false;
let showAll = false;
const paths = [];

for (const arg of argv) {
if (arg === "-1") {
onePerLine = true;
} else if (arg === "-a") {
showAll = true;
} else {
paths.push(arg);
}
}

if (paths.length === 0) {
paths.push(".");
}

for (const path of paths) {
try {
const info = await stat(path);

if (info.isDirectory()) {
let files = await readdir(path);

if (!showAll) {
files = files.filter((file) => !file.startsWith("."));
}

if (onePerLine) {
for (const file of files) {
console.log(file);
}
} else {
for (const file of files) {
process.stdout.write(`${file} `);
}
process.stdout.write("\n");
}
} else {
console.log(path);
}
} catch (err) {
console.error(err.message);
}
}
78 changes: 78 additions & 0 deletions implement-shell-tools/wc/wc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import { readFile } from "node:fs/promises";
import process from "node:process";

const argvs= process.argv.slice(2);
let countLines = false;
let countWords = false;
let countBytes = false;
let totalWords = 0;
let totalLines = 0;
let totalBytes = 0;
const files = []

for (const arg of argvs) {
if (arg === "-l") {
countLines = true;
} else if (arg === "-w") {
countWords = true;
} else if (arg === "-c") {
countBytes = true;
} else {
files.push(arg);
}
}

for (const file of files) {
try {
const content = await readFile(file, "utf-8");
const arrayOfLines = content.split("\n");
const arrayOfWords = content.trim().split(/\s+/)
const bytes = Buffer.byteLength(content, "utf-8");
const lines = arrayOfLines.length -1;
const words = arrayOfWords.length;
totalLines += lines;
totalBytes += bytes;
totalWords +=words
if (countLines && countWords) {
process.stdout.write(` ${lines} ${words} ${file}\n`);

} else if (countLines) {
process.stdout.write(` ${lines} ${file}\n`);

} else if (countWords){
process.stdout.write(` ${words} ${file}\n`);

} else if (countBytes) {
process.stdout.write(` ${bytes} ${file}\n`);

} else {
process.stdout.write(` ${lines} ${words} ${bytes} ${file}\n`);
}

} catch(err) {
console.error(err.message);
}
}

if (files.length > 1 ) {
if (countLines && countWords) {
process.stdout.write(` ${totalLines} ${totalWords} total\n`);

} else if (countLines) {
process.stdout.write(` ${totalLines} total\n`);

} else if (countWords){
process.stdout.write(` ${totalWords} total\n`);

} else if (countBytes) {
process.stdout.write(` ${totalBytes} total\n`);

} else {
process.stdout.write(` ${totalLines} ${totalWords} ${totalBytes} total\n`);
}
}





Loading