From bf584328d4ca4f349a752dff929e63c3416c2a43 Mon Sep 17 00:00:00 2001 From: katarzynakaz Date: Sat, 7 Feb 2026 18:44:19 +0000 Subject: [PATCH] impl shell tools done --- implement-shell-tools/cat/index.js | 87 ++++++++++++++++++++++++++++++ implement-shell-tools/cat/notes.js | 46 ++++++++++++++++ implement-shell-tools/ls/index.js | 49 +++++++++++++++++ implement-shell-tools/wc/index.js | 77 ++++++++++++++++++++++++++ 4 files changed, 259 insertions(+) create mode 100644 implement-shell-tools/cat/index.js create mode 100644 implement-shell-tools/cat/notes.js create mode 100644 implement-shell-tools/ls/index.js create mode 100644 implement-shell-tools/wc/index.js diff --git a/implement-shell-tools/cat/index.js b/implement-shell-tools/cat/index.js new file mode 100644 index 00000000..cb799d81 --- /dev/null +++ b/implement-shell-tools/cat/index.js @@ -0,0 +1,87 @@ +import process from "node:process"; +import { promises as fs } from "node:fs"; + + +//one for 1 and 3 +async function printOneOrMore(listOfFiles) { + for (const file of listOfFiles) { + const content = await fs.readFile(file, "utf-8"); + console.log(content); + } +} + + +// // 2 * `cat -n sample-files/1.txt` +// async function caseTwo(oneFile) { +// const content = await fs.readFile(oneFile, "utf-8"); +// const separatedToLines = content.split('\n') +// separatedToLines.forEach((line, index) => { +// console.log(`${index + 1} ${line}`) +// }) +// } + +// // 4 * `cat -n sample-files/*.txt` +// async function caseFour(listOfFiles) { +// for (const file of listOfFiles) { +// const content = await fs.readFile(one, "utf-8"); + +// const separatedToLines = content.split('\n') +// separatedToLines.forEach((line, index) => { +// console.log(`${index + 1} ${line}`) +// }) +// } + +// } + +//one instead +// 2 * `cat -n sample-files/1.txt` +// 4 * `cat -n sample-files/*.txt` + +async function caseTwoAndFour(listOfFiles) { + for (const file of listOfFiles) { + const content = await fs.readFile(file, "utf-8"); + + const separatedToLines = content.split('\n') + separatedToLines.forEach((line, index) => { + console.log(`${index + 1} ${line}`) + }) +} + +} + +// `cat -b sample-files/3.txt` +async function caseFive(listOfFiles) { + for (const file of listOfFiles) { + const content = await fs.readFile(file, "utf-8"); + const separatedToLines = content.split('\n'); + + let countingOnlyFullLines = 1 + separatedToLines.forEach((line, index) => { + if (line !== '') { + console.log(`${countingOnlyFullLines} ${line}`) + countingOnlyFullLines++ + } else { + console.log('') + } + + }) + } + +} + + +const argv = process.argv.slice(2); + +switch (argv[0]) { + case '-n': + await caseTwoAndFour(argv.slice(1)); + break; + + case '-b': + await caseFive(argv.slice(1)); + break; + + default: + await printOneOrMore(argv); + break; +} \ No newline at end of file diff --git a/implement-shell-tools/cat/notes.js b/implement-shell-tools/cat/notes.js new file mode 100644 index 00000000..87f4fd2c --- /dev/null +++ b/implement-shell-tools/cat/notes.js @@ -0,0 +1,46 @@ +import process from "node:process"; +import { promises as fs } from "node:fs"; +// const fs = promises + +// * `cat sample-files/1.txt` +// * `cat -n sample-files/1.txt` +// * `cat sample-files/*.txt` +// * `cat -n sample-files/*.txt` +// * `cat -b sample-files/3.txt` + +// process.argv documentation that process.argv[0] will be the path to node +// process.argv[1] will be the path to this file +// the arguments start at index 2 + +const argv = process.argv.slice(2); +if (argv.length != 1) { + console.error(`Expected exactly 1 argument (a path) to be passed but got ${argv.length}.`); + process.exit(1); +} +const path = argv[0]; + +// const content = await fs.readFile(path, "utf-8"); +// const countOfWordsContainingEs = content +// .split(" ") +// .filter((word) => word.includes("e")) +// .length; +// console.log(countOfWordsContainingEs); + +// `cat sample-files/1.txt` +const content = await fs.readFile('sample-files/1.txt', "utf-8"); +const contentsOfFileOne = content +console.log(contentsOfFileOne); + +// * `cat -n sample-files/1.txt` +const separatedToLines = content.split('\n') +separatedToLines.forEach((line, countLine) => { + countLine+=1 + console.log(line, countLine}) +const withAddedCount = countFileOne. + +// * `cat sample-files/*.txt` + +// * `cat -n sample-files/*.txt` + +// * `cat -b sample-files/3.txt` + diff --git a/implement-shell-tools/ls/index.js b/implement-shell-tools/ls/index.js new file mode 100644 index 00000000..5dc90f6a --- /dev/null +++ b/implement-shell-tools/ls/index.js @@ -0,0 +1,49 @@ +// fs.readdir +import process from "node:process"; +import { promises as fs } from "node:fs"; + + +// `ls -1` +async function showAllFilesInDir(directory) { + const listOfFiles = await fs.readdir(directory); + + for (const eachFile of listOfFiles) { + console.log(eachFile); + } +} + +// `ls -1 sample-files` +async function showVisibleInSampleFiles() { + const listOfFiles = await fs.readdir('sample-files'); + + for (const eachFile of listOfFiles) { + if (eachFile[0] !== '.') { + console.log(eachFile); + } + + } +} + + +// `ls -1 -a sample-files` +async function showAllInSampleFiles() { + const listOfFiles = await fs.readdir('sample-files'); + + for (const eachFile of listOfFiles) { + + console.log(eachFile); + + } +} + + + +const argv = process.argv.slice(2); + +if (argv.includes('-a')) { + await showAllInSampleFiles(); +} else if (argv.includes('sample-files')) { + await showVisibleInSampleFiles(); +} else { + await showCurrentDir(); +} diff --git a/implement-shell-tools/wc/index.js b/implement-shell-tools/wc/index.js new file mode 100644 index 00000000..92a366b9 --- /dev/null +++ b/implement-shell-tools/wc/index.js @@ -0,0 +1,77 @@ +import process from "node:process"; +import { promises as fs } from "node:fs"; + +//from coursework +// const content = await fs.readFile(path, "utf-8"); +// const countOfWordsContainingEs = content +// .split(" ") +// .filter((word) => word.includes("e")) +// .length; +// console.log(countOfWordsContainingEs); + +function countHelper(inputFiles) { + return { + lines: inputFiles.split('\n').length - 1, + words: inputFiles.split(' ').filter(w => w !== "").length, + bytes: inputFiles.length, + }; +} + + +// * `wc -l sample-files/3.txt` +// * `wc -l sample-files/*` +async function countLines(listOfFiles) { + for (const file of listOfFiles) { + const content = await fs.readFile(file, "utf-8"); + + // const linesNumbered = content.split('\n').length-1 + const counts = countHelper(content); + console.log(`${counts.lines} ${file}`) + } +} + +// * `wc -w sample-files/3.txt` +async function countWords(listOfFiles) { + for (const file of listOfFiles) { + const content = await fs.readFile(file, "utf-8"); + + // const wordsCounted = content.split(" ").filter(word => word !== "").length; + // console.log(`${wordsCounted} ${file}`); + const counts = countHelper(content); + console.log(`${counts.words} ${file}`); +} + +} + +// * `wc -c sample-files/3.txt` +async function countBytes(listOfFiles) { + for (const file of listOfFiles) { + const content = await fs.readFile(file, "utf-8"); + // const bytesCounted = content.length; + const counts = countHelper(content); + console.log(`${counts.bytes} ${file}`); + } +} + +// * `wc sample-files/*` +async function countAll(listOfFiles) { + for (const file of listOfFiles) { + const content = await fs.readFile(file, "utf-8"); + const counts = countHelper(content) + + console.log(`${counts.lines} ${counts.words} ${counts.bytes} ${file}`); + } +} + +const argv = process.argv.slice(2); +const files = argv.filter(arg => !arg.startsWith('-')); + +if (argv.includes('-l')) { + await countLines(files); +} else if (argv.includes('-w')) { + await countWords(files); +} else if (argv.includes('-c')) { + await countBytes(files); +} else { + await countAll(files); +} \ No newline at end of file