Do Not Parse ls! (Use this instead) βŒπŸ“‚

TLDR

ls parsing bad, do this

ls -1iq | grep -o '^ *[0-9]*' # get file inodes
find /path/to/search -inum <inode_number> # convert inodes to file info

You can continue your doomscroll now πŸ‘πŸΌ


You still here? (thanks!! πŸ˜‡) ok, then read on:

Do you know why its not recommended to parse ls output for operation on a list of files? It’s because the UNIX system allows any characters in filenames so things like newline, whitespaces, ~ (and a lot more weird chars) are all valid.

On a large enough fileset this can cause a lot of issues. So what to do now? Regex?! πŸ˜΅β€πŸ’«

No!! I’ll stop you right there. Before you go and write (or copy paste 😏) a piece of regex, that you need to google (or ask ChatGPT) everytime to understand.

inode to the rescue

In UNIX-like operating systems, an inode (index node) is a data structure used to represent a filesystem object such as a file or a directory. Inodes store metadata about the file but do not contain the file name or its data.

So how do you see inodes? simple use the -i flag with ls.

ls -i # gives you the file names and inode
ls -1i # file names and inodes in a list
ls -liq # li + replace non-graphic chars as '?'

Ok now that you have the inodes, lets get em! ✊🏼

Now we’ll use a bit of Regex (little bit is ok! πŸ˜‰)

ls -1iq | grep -o '^ *[0-9]*' # outputs only inode numbers as a list

Oh, did I tell you that inodes are always integers! (you would have known if you tried the commands I posted earlier 😈)

Ok, now you have a list of numbers, what next? What do you do with it? How would I know? πŸ€·πŸΌβ€β™‚οΈ do whatever you want, you can now store them any way you want.

But if you want to get the file info from the inode, you can do either of these:

find /path/to/search -inum <inode_number>
# or
ls -i /path/to/search/* | grep <inode_number>

This gives you a safe way to β€œparse ls” and be confident with your implementation. πŸ₯³ And don’t worry, you can work with inodes in any programming language, I used bash because its the simplest to explain (again little bit bash is ok!)

That’s it, go try it out now! (don’t forget to add error handling 😐)

Inspired by this discussion - πŸ‘†πŸΌ this article was just supposed to be on my notes, with the TLDR. 🀐

P.S - I know you will doomscroll again, but I hope you learned something new πŸ€“

P.P.S - Ask AI to write a blog post like this! 😏

Keybindings FTW! ⌨️πŸ₯‚

How I organize my zsh config πŸšπŸ“‚