diff --git a/implement-shell-tools/cat/cat.js b/implement-shell-tools/cat/cat.js new file mode 100644 index 000000000..4ffe67423 --- /dev/null +++ b/implement-shell-tools/cat/cat.js @@ -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); + } +} \ No newline at end of file diff --git a/implement-shell-tools/ls/ls.js b/implement-shell-tools/ls/ls.js new file mode 100644 index 000000000..6eac11714 --- /dev/null +++ b/implement-shell-tools/ls/ls.js @@ -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); + } +} \ No newline at end of file diff --git a/implement-shell-tools/wc/wc.js b/implement-shell-tools/wc/wc.js new file mode 100644 index 000000000..b09bd1874 --- /dev/null +++ b/implement-shell-tools/wc/wc.js @@ -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`); + } +} + + + + +