diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 000000000..616f514c4 Binary files /dev/null and b/.DS_Store differ diff --git a/implement-shell-tools/.DS_Store b/implement-shell-tools/.DS_Store new file mode 100644 index 000000000..18e596097 Binary files /dev/null and b/implement-shell-tools/.DS_Store differ diff --git a/implement-shell-tools/cat/index.js b/implement-shell-tools/cat/index.js new file mode 100644 index 000000000..86c19f134 --- /dev/null +++ b/implement-shell-tools/cat/index.js @@ -0,0 +1,50 @@ +import { readFileSync } from "node:fs"; + +function cleanInput(listOfFiles) { + let cleanLinesArr = []; + + for (const file of listOfFiles) { + const grabbedText = readFileSync(file, "utf-8"); + const splitLines = grabbedText.split("\n"); + cleanLinesArr.push(...splitLines); + } + return cleanLinesArr; +} + +const args = process.argv.slice(2); +let flag; +let restIsFiles; + +if (args[0] && args[0][0] === "-") { + flag = args[0]; + restIsFiles = args.slice(1); +} else { + flag = null; + restIsFiles = args; +} + +function takeSpecifiedAction(cleanLinesArr, flag) { + let countingOnlyFullLines = 1; + + for (const file of cleanLinesArr) { + // Task: We recommend you start off supporting no flags, then add support for `-n`, then add support for `-b`. + if (!flag) { + console.log(file); + } else if (flag === "-n") { + console.log(`${countingOnlyFullLines} ${file}`); + countingOnlyFullLines += 1; + } else if (flag === "-b") { + if (file === "") { + console.log(""); + } else { + console.log(`${countingOnlyFullLines} ${file}`); + countingOnlyFullLines += 1; + } + } else { + console.log("incorrect flag"); + } + } +} + +const lines = cleanInput(restIsFiles); +takeSpecifiedAction(lines, flag); diff --git a/implement-shell-tools/ls/index.js b/implement-shell-tools/ls/index.js new file mode 100644 index 000000000..c14cb0e94 --- /dev/null +++ b/implement-shell-tools/ls/index.js @@ -0,0 +1,41 @@ +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) { + if (eachFile[0] !== ".") 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 showAllFilesInDir("."); +} diff --git a/implement-shell-tools/wc/index.js b/implement-shell-tools/wc/index.js new file mode 100644 index 000000000..be50589be --- /dev/null +++ b/implement-shell-tools/wc/index.js @@ -0,0 +1,74 @@ +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 calculateCounts(inputFiles) { + return { + lines: inputFiles.split("\n").length - 1, + words: inputFiles.split(/\s+/).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 = calculateCounts(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 = calculateCounts(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 = calculateCounts(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 = calculateCounts(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); +}