Every file and directory in Linux carries a permission set that controls who can read, write, or execute it. These permissions appear in the output of ls -l as a string like rwxr-xr-x, broken into three triplets for the owner, the group, and everyone else. The chmod command changes them, either using octal numbers such as chmod 755 file (giving the owner full access and others read/execute), or symbolic forms like chmod u+x file to add execute permission for the user. Ownership itself is changed with chown user:group file, which requires root privileges when applied to files you do not own.
Searching through files and the filesystem is another everyday need. grep pattern file prints lines that match a pattern; -i makes the search case-insensitive and -r walks through directories recursively. To locate files by name, find /path -name "*pattern*" searches in real time, with -type f narrowing results to files and -type d to directories. For a faster alternative, locate filename queries a pre-built index updated by the updatedb command, returning matches almost instantly at the cost of slight staleness.
One of the shell's most powerful features is the ability to chain commands together and redirect their data. Output redirection with > writes a command's output to a file, overwriting any existing content, while >> appends to the file instead — for example, ls > list.txt saves a directory listing. Input redirection with < feeds a file into a command, as in sort < names.txt. Pipes (|) go further by sending the output of one command directly into another, enabling compositions like ls | grep txt to show only files whose names contain "txt". These primitives let you build complex data-processing pipelines from simple tools.