Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
node_modules
.DS_Store
__pycache__/
*.pyc
38 changes: 38 additions & 0 deletions implement-shell-tools/cat/myCat.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { program } from "commander";
import { promises as fs } from "node:fs";

program
.name("myCat")
.description("Simple file viewer")
.option("-n", "Number all output lines")
.option("-b", "Number non-blank output lines")
.argument("<path...>", "One or more file paths to show");

program.parse();

const files = program.args;
const opts = program.opts();
let lineNumber = 1;

for (const filename of files) {
const content = await fs.readFile(filename, "utf-8");
const lines = content.split("\n");

if (opts.n) {

for (const line of lines) {
console.log(lineNumber + " " + line);
lineNumber++;
}
} else if (opts.b) {

for (const line of lines) {
if (line.trim() !== "") {
console.log(lineNumber + " " + line);
lineNumber++;
}
}
} else {
console.log(content);
}
}
35 changes: 35 additions & 0 deletions implement-shell-tools/ls/myLs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { program } from "commander";
import { promises as fs } from "node:fs";

program
.name("myLs")
.description("my ls clone")
.option("-1, --one-per-line", "one entry per line")
.option("-a", "show hidden files")
.argument("[paths...]", "file or directory paths");

program.parse();

const opts = program.opts();
let paths = program.args;

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

for (const path of paths) {
const directoryItems = await fs.readdir(path);

for (const file of directoryItems) {
if (!opts.a && file.startsWith(".")) {
continue;
}

if (opts.onePerLine) {
console.log(file);
} else {
console.log(file + " ");
}
}

}
21 changes: 21 additions & 0 deletions implement-shell-tools/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions implement-shell-tools/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"type": "module",
"dependencies": {
"commander": "^14.0.2"
}
}
62 changes: 62 additions & 0 deletions implement-shell-tools/wc/MyWc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { program } from "commander";
import { promises as fs } from "node:fs";

program
.name("myWc")
.description("my wc clone")
.option("-l", "line count")
.option("-w", "words count")
.option("-c", "character count")
.option("-s", "character count without spaces")
.argument("[paths...]", "file or directory paths");

program.parse();

const opts = program.opts();
let files = program.args;

if (files.length === 0) {
files = ["."];
}

let totalLines = 0;
let totalWords = 0;

if (opts.l) {
for (const file of files) {
const content = await fs.readFile(file, "utf-8");
const lineCount = content.split("\n").length;

totalLines += lineCount;
}
console.log("Lines:", totalLines);
}
if (opts.w) {
for (const file of files) {
const content = await fs.readFile(file, "utf-8");

const wordCount = content.trim().split(/\s+/).length;
totalWords += wordCount;
}
console.log("Total words:", totalWords);
}
if (opts.c) {
let totalChars = 0;
for (const file of files) {
const content = await fs.readFile(file, "utf-8");

totalChars += content.trim().length;

}
console.log("Total characters:", totalChars);
}

if (opts.s) {
let totalCharsNoSpaces = 0;
for (const file of files) {
const content = await fs.readFile(file, "utf-8");
const withoutSpaces = content.replace(/\s/g, "");
totalCharsNoSpaces += withoutSpaces.length;
}
console.log("Total characters without spaces:", totalCharsNoSpaces);
}
Loading