<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Raja ishaq Nabi Khan on Medium]]></title>
        <description><![CDATA[Stories by Raja ishaq Nabi Khan on Medium]]></description>
        <link>https://medium.com/@ishaaq.raja?source=rss-bd02ebfbd1a8------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*SDkvdPWoqgIFk5eXBn5mQg.png</url>
            <title>Stories by Raja ishaq Nabi Khan on Medium</title>
            <link>https://medium.com/@ishaaq.raja?source=rss-bd02ebfbd1a8------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 05 Nov 2026 04:51:48 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@ishaaq.raja/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[The LLM Race in November 2026: Meet the Models Redefining Artificial Intelligence]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@ishaaq.raja/the-llm-race-in-november-2026-meet-the-models-redefining-artificial-intelligence-3346ceabb904?source=rss-bd02ebfbd1a8------2"><img src="https://cdn-images-1.medium.com/max/1672/1*sky-RdeJtDybEZQ2SFIKlA.png" width="1672"></a></p><p class="medium-feed-snippet">From GPT-6.1 Terra and Gemini 4 Carbon to Claude 5.5,</p><p class="medium-feed-link"><a href="https://medium.com/@ishaaq.raja/the-llm-race-in-november-2026-meet-the-models-redefining-artificial-intelligence-3346ceabb904?source=rss-bd02ebfbd1a8------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@ishaaq.raja/the-llm-race-in-november-2026-meet-the-models-redefining-artificial-intelligence-3346ceabb904?source=rss-bd02ebfbd1a8------2</link>
            <guid isPermaLink="false">https://medium.com/p/3346ceabb904</guid>
            <category><![CDATA[chatgpt]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[meta]]></category>
            <category><![CDATA[claude]]></category>
            <dc:creator><![CDATA[Raja ishaq Nabi Khan]]></dc:creator>
            <pubDate>Wed, 04 Nov 2026 16:48:44 GMT</pubDate>
            <atom:updated>2026-11-04T16:48:44.208Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[10 Linux Filesystem Tricks Most Users Learn Too Late]]></title>
            <link>https://medium.com/@ishaaq.raja/10-linux-filesystem-tricks-most-users-learn-too-late-c3c73003258d?source=rss-bd02ebfbd1a8------2</link>
            <guid isPermaLink="false">https://medium.com/p/c3c73003258d</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[bash]]></category>
            <dc:creator><![CDATA[Raja ishaq Nabi Khan]]></dc:creator>
            <pubDate>Wed, 28 Oct 2026 11:31:01 GMT</pubDate>
            <atom:updated>2026-10-28T11:31:01.789Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Understand what is really happening behind your files, directories, disk space, and symbolic links.</em></p><p>Most Linux users learn how to create files, copy directories, and delete unwanted data. But the filesystem has several behaviors that are not immediately obvious.</p><p>Why does a disk appear full when du cannot account for the used space? Why can a file still consume disk space after being deleted? What is the difference between a symbolic link and a hard link? And why can two paths point to the same underlying file?</p><p>Understanding these details makes you better at troubleshooting, managing storage, and avoiding mistakes that can cost you hours of work.</p><p>Here are 10 Linux filesystem techniques worth learning.</p><h3>1. Understand That a Filename Is Not the File Itself</h3><p>Linux filesystems commonly use <strong>inodes</strong> to store metadata about files, including ownership, permissions, timestamps, and references to the file’s data blocks.</p><p>A filename is an entry in a directory that points to an inode. This distinction explains several otherwise confusing behaviors.</p><p>Inspect a file’s inode with:</p><pre>ls -i report.txt</pre><p>For more detailed metadata, use:</p><pre>stat report.txt</pre><p>You can inspect the inode number, file size, permissions, ownership, and timestamps.</p><p>Why does this matter?</p><ul><li>Multiple filenames can refer to the same inode through hard links.</li><li>Renaming a file within the same filesystem generally changes its directory entry, not the underlying file data.</li><li>Deleting a filename does not necessarily remove the underlying data immediately.</li></ul><p><strong>Professional habit:</strong> When investigating file identity, metadata, or unexpected storage behavior, use stat instead of relying only on the filename.</p><h3>2. Know When to Use Hard Links and Symbolic Links</h3><p>Both hard links and symbolic links provide alternative ways to access files, but they work differently.</p><p>A <strong>hard link</strong> is another directory entry referring to the same inode. A <strong>symbolic link</strong>, or symlink, stores a path to another file or directory.</p><p>Create a hard link:</p><pre>ln original.txt hardlink.txt</pre><p>Create a symbolic link:</p><pre>ln -s original.txt symlink.txt</pre><p>Inspect them with:</p><pre>ls -li original.txt hardlink.txt symlink.txt</pre><p>The original file and hard link normally share the same inode number. The symbolic link has its own inode.</p><p>The practical differences are important:</p><ul><li>Hard links generally cannot cross filesystem boundaries and usually cannot be created for directories by ordinary users.</li><li>Symbolic links can point across filesystems and can reference directories.</li><li>A symbolic link can become broken if its target is moved or deleted.</li><li>Removing one hard-linked filename does not remove the file’s data while another hard link remains.</li></ul><p><strong>When to use them:</strong> Use symlinks for convenient paths, alternate directory layouts, and references to files on other filesystems. Use hard links when you deliberately want multiple names for the same underlying file.</p><h3>3. Find Out Where Your Disk Space Actually Went</h3><p>One of the most common Linux troubleshooting problems is a filesystem that is nearly full even though the visible files do not appear large enough to explain the usage.</p><p>Start with:</p><pre>df -h</pre><p>This reports filesystem-level capacity and usage in human-readable units.</p><p>Next, inspect directory usage:</p><pre>du -sh /path/to/directory</pre><p>To identify the largest immediate subdirectories:</p><pre>du -h --max-depth=1 /path/to/directory | sort -h</pre><p>These commands answer different questions:</p><ul><li>df reports space usage from the filesystem&#39;s perspective.</li><li>du estimates space used by files and directories it can traverse.</li></ul><p>If their results differ significantly, possible explanations include deleted files that are still open by running processes, inaccessible directories, filesystem metadata, reserved blocks, or differences between allocated and apparent file sizes.</p><p>To inspect large directories without crossing into other mounted filesystems:</p><pre>sudo du -xhd1 /var 2&gt;/dev/null | sort -h</pre><p>The -x option keeps du on the same filesystem, which can make the results easier to interpret.</p><p><strong>Professional habit:</strong> Use df to identify the affected filesystem, then use du to investigate its directories. Do not assume that the largest visible file is necessarily the cause.</p><h3>4. Remember That Deleting a File Does Not Always Free Its Space</h3><p>This is one of the most useful filesystem behaviors to understand.</p><p>On Linux, a process can keep a file open even after its directory entry has been removed. The file’s storage remains allocated until the final open reference is closed.</p><p>This often happens with application logs.</p><p>Imagine a log file grows to several gigabytes. You delete it to free space, but df -h still shows almost the same usage.</p><p>Check for deleted files that are still open:</p><pre>sudo lsof +L1</pre><p>Look for entries showing deleted files with open file descriptors.</p><p>If a process is holding a deleted log file open, the usual solution is to use the application’s supported log-reopen mechanism or restart the relevant service when safe and appropriate.</p><p>Avoid blindly killing processes or writing to file descriptors you do not understand.</p><p><strong>Why this matters:</strong> On production systems, this can explain why deleting a large log file does not recover the expected disk space.</p><h3>5. Use findmnt to Understand Mounted Filesystems</h3><p>Linux presents storage devices through a unified directory tree. A separate filesystem can be mounted at a directory such as /mnt/data, /home, or /var.</p><p>This means two directories that appear close together in the directory tree may reside on different filesystems.</p><p>To see what is mounted and where:</p><pre>findmnt</pre><p>To inspect the filesystem backing a particular path:</p><pre>findmnt -T /home</pre><p>You can also use:</p><pre>df -hT /home</pre><p>The -T option displays filesystem types alongside capacity information.</p><p>Why is this useful?</p><ul><li>A directory may be on a separate disk or partition.</li><li>Moving files between filesystems is generally a copy-and-remove operation rather than a simple metadata rename.</li><li>A filesystem mounted over an existing directory hides the directory’s previous visible contents until it is unmounted.</li></ul><p>That last point is particularly important when troubleshooting missing files under mount points.</p><p><strong>Professional habit:</strong> Before moving large amounts of data or investigating storage issues, determine which filesystem actually backs the path.</p><h3>6. Inspect Symbolic Links Instead of Guessing Their Targets</h3><p>A symbolic link may look like an ordinary file or directory in a listing, but it points somewhere else.</p><p>Display a link’s target with:</p><pre>ls -l mylink</pre><p>Resolve the final path with:</p><pre>readlink -f mylink</pre><p>For example:</p><pre>ln -s /var/log/application.log app.log<br>readlink -f app.log</pre><p>The resolved path helps establish where the link ultimately leads, provided the target can be resolved.</p><p>You can also inspect the link itself rather than the target:</p><pre>stat -c &#39;%N&#39; mylink</pre><p>This is useful when dealing with application configuration, shared directories, software installations, or paths that contain several layers of symbolic links.</p><p>One important detail: a relative symbolic link is resolved relative to the directory containing the link, not relative to the shell’s current working directory.</p><p><strong>Professional habit:</strong> When a path behaves unexpectedly, check whether it is a symbolic link before changing or deleting anything.</p><h3>7. Use mktemp Instead of Inventing Temporary Filenames</h3><p>Temporary files are useful for intermediate results, downloads, scripts, and test output. But manually choosing a name such as temp.txt can cause collisions when multiple commands or users operate at the same time.</p><p>Use mktemp to create a unique temporary file:</p><pre>tmpfile=$(mktemp)</pre><p>For a temporary directory:</p><pre>tmpdir=$(mktemp -d)</pre><p>Use the resulting path in your script:</p><pre>printf &#39;Temporary data\n&#39; &gt; &quot;$tmpfile&quot;<br>cat &quot;$tmpfile&quot;</pre><p>When finished, remove the file or directory you created:</p><pre>rm -f -- &quot;$tmpfile&quot;</pre><p>For a temporary directory, ensure it contains only data that you intend to remove before running a recursive deletion.</p><p>For scripts that need cleanup even after interruption, a trap can help:</p><pre>tmpfile=$(mktemp) || exit 1<br>trap &#39;rm -f -- &quot;$tmpfile&quot;&#39; EXIT</pre><p>This schedules cleanup when the shell exits normally or through many common error and interruption paths. It does not guarantee cleanup after every possible failure, such as a forced termination.</p><p><strong>Professional habit:</strong> Use mktemp for temporary paths, and quote variables whenever they represent filenames.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MFN4BmM1Jq8CEyBphNu74Q.png" /></figure><h3>8. Distinguish Apparent File Size From Disk Space Used</h3><p>A file’s reported size is not necessarily equal to the amount of storage allocated to it.</p><p>Compare these commands:</p><pre>ls -lh largefile.img<br>du -h largefile.img</pre><p>ls -lh reports the file&#39;s apparent size. du -h reports the space allocated to the file, rounded for display.</p><p>Sparse files illustrate the difference. A sparse file can contain large regions of logical zeroes that do not require corresponding physical data blocks.</p><p>Create a test file:</p><pre>truncate -s 1G sparse.img</pre><p>Now inspect it:</p><pre>ls -lh sparse.img<br>du -h sparse.img</pre><p>The file appears to be 1 GB in logical size, but its allocated space may be much smaller.</p><p>Sparse files are useful for virtual disk images, database files, and applications that benefit from representing empty regions efficiently. However, not every tool, filesystem, or storage destination preserves sparseness in the same way.</p><p><strong>Professional habit:</strong> When investigating storage, check both apparent size and allocated space. They answer different questions.</p><h3>9. Use install to Create Directories and Deploy Files Cleanly</h3><p>Many users create directories, copy files, and then change permissions in separate commands. The install utility can combine some of these steps.</p><p>Create a directory with specified permissions:</p><pre>install -d -m 755 /tmp/myapp</pre><p>Copy a file while setting its destination permissions:</p><pre>install -m 644 config.conf /tmp/myapp/config.conf</pre><p>Install an executable with executable permissions:</p><pre>install -m 755 myscript.sh /tmp/myapp/myscript.sh</pre><p>Unlike a plain cp, install is designed for deployment-style copying and can set destination permissions. It does not preserve all source metadata by default, so choose the appropriate method when ownership, timestamps, ACLs, extended attributes, or other metadata must be retained.</p><p>Also, the modes above are examples, not universal recommendations. Choose permissions appropriate for the content and the users who need access.</p><p><strong>When to use it:</strong> install is especially handy in shell scripts, deployment procedures, and Makefiles where files need to be placed at known destinations with predictable permissions.</p><h3>10. Use Atomic File Replacement to Avoid Partially Written Configuration Files</h3><p>Suppose a script updates a configuration file by writing directly to it:</p><pre>generate_config &gt; config.conf</pre><p>If the generating command fails after writing only part of the output, the original configuration may already have been truncated or replaced with incomplete content.</p><p>A safer pattern is to write to a temporary file first, verify that generation succeeded, and then rename it into place.</p><pre>tmpfile=$(mktemp ./config.conf.XXXXXX) || exit 1</pre><pre>if generate_config &gt; &quot;$tmpfile&quot;; then<br>    mv -f -- &quot;$tmpfile&quot; config.conf<br>else<br>    rm -f -- &quot;$tmpfile&quot;<br>    exit 1<br>fi</pre><p>Because the temporary file is created in the same directory, the final rename is normally atomic on a local filesystem that supports standard rename semantics. Readers will see either the old file or the new file, rather than a partially written intermediate version.</p><p>There are important caveats:</p><ul><li>The generating command must report failures correctly.</li><li>The destination directory must be writable.</li><li>Atomic visibility does not by itself guarantee that data has been durably written to physical storage after a sudden power loss.</li><li>Replacing a file this way can change ownership, permissions, and other metadata unless you deliberately preserve or set them.</li></ul><p><strong>Professional habit:</strong> For configuration files and other critical outputs, generate first, validate second, and replace the destination only after success.</p><h3>Final Thoughts</h3><p>Linux filesystem expertise is not just about memorizing ls, cp, mv, and rm. It is about understanding how names, inodes, storage allocation, mounts, and file descriptors interact.</p><p>The most valuable habits from this list are:</p><ul><li>Use stat when you need to understand file metadata.</li><li>Know the difference between hard links and symbolic links.</li><li>Use df and du together to investigate storage.</li><li>Check for deleted files that remain open.</li><li>Inspect mount points before moving or troubleshooting data.</li><li>Use mktemp for safe temporary paths.</li><li>Understand apparent size versus allocated disk space.</li><li>Replace critical files carefully rather than overwriting them prematurely.</li></ul><p>These details may seem small, but they make a real difference when debugging storage problems, writing reliable scripts, or maintaining Linux systems.</p><p><strong>The goal is not to know more commands. It is to understand what the filesystem is actually doing.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c3c73003258d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[10 SSH Tricks That Make Remote Linux Work Much Easier]]></title>
            <link>https://medium.com/@ishaaq.raja/10-ssh-tricks-that-make-remote-linux-work-much-easier-ad6477ff1d39?source=rss-bd02ebfbd1a8------2</link>
            <guid isPermaLink="false">https://medium.com/p/ad6477ff1d39</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[bash]]></category>
            <category><![CDATA[command-line]]></category>
            <dc:creator><![CDATA[Raja ishaq Nabi Khan]]></dc:creator>
            <pubDate>Sat, 24 Oct 2026 11:00:59 GMT</pubDate>
            <atom:updated>2026-10-24T11:00:59.784Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Go beyond </em><em>ssh user@server. Learn host aliases, key-based authentication, connection multiplexing, port forwarding, remote commands, and other techniques that make working on Linux servers faster and more reliable.</em></p><p>If you work with Linux servers, you probably use SSH regularly.</p><p>You type something like:</p><pre>ssh user@192.168.1.100</pre><p>You enter your credentials, connect to the machine, and start working.</p><p>That is fine for basic remote access. But SSH can do much more than open a remote terminal.</p><p>You can connect to multiple servers using short aliases, execute commands without opening an interactive session, transfer files securely, forward ports, reuse existing connections, and troubleshoot network problems without installing additional software.</p><p>The difference is not about memorizing more commands. It is about learning how to configure SSH so that routine work requires fewer steps.</p><p>Here are 10 SSH techniques worth learning if you work with remote Linux machines.</p><h3>1. Stop Typing Long SSH Commands: Use Host Aliases</h3><p>Suppose you regularly connect to three servers:</p><pre>ssh raja@192.168.1.100<br>ssh raja@192.168.1.101<br>ssh admin@10.0.0.25</pre><p>You must remember each address and username. If a server requires a particular key or port, the command becomes even longer.</p><p>SSH configuration solves this problem.</p><p>Open your SSH configuration file:</p><pre>nano ~/.ssh/config</pre><p>Add entries like these:</p><pre>Host workserver<br>    HostName 192.168.1.100<br>    User raja</pre><pre>Host testserver<br>    HostName 192.168.1.101<br>    User raja</pre><pre>Host production<br>    HostName 10.0.0.25<br>    User admin<br>    Port 2222</pre><p>Now connect using:</p><pre>ssh workserver</pre><p>Or:</p><pre>ssh testserver</pre><p>Or:</p><pre>ssh production</pre><p>SSH reads the configuration and fills in the appropriate connection details.</p><p>You can also specify a private key:</p><pre>Host workserver<br>    HostName 192.168.1.100<br>    User raja<br>    IdentityFile ~/.ssh/work_key<br>    IdentitiesOnly yes</pre><p>This is particularly useful when managing several servers with different accounts and authentication requirements.</p><p><strong>Power-user takeaway:</strong> Put recurring connection settings in ~/.ssh/config instead of repeatedly typing them at the command line.</p><p>The IP addresses and usernames above are examples. Replace them with your actual server details.</p><h3>2. Use SSH Keys Instead of Repeated Password Authentication</h3><p>If you connect to the same server frequently, key-based authentication can simplify the login process and provide strong security when configured correctly.</p><p>First, generate an SSH key pair on your local machine:</p><pre>ssh-keygen -t ed25519</pre><p>Follow the prompts. A passphrase is recommended to protect the private key if the file is copied or stolen.</p><p>This creates two files by default:</p><pre>~/.ssh/id_ed25519<br>~/.ssh/id_ed25519.pub</pre><p>The first is your private key. Keep it private.</p><p>The second is your public key. It can be installed on the server.</p><p>On a system that supports it, run:</p><pre>ssh-copy-id raja@192.168.1.100</pre><p>Then connect:</p><pre>ssh raja@192.168.1.100</pre><p>After successful setup, SSH can authenticate using the key instead of requiring the account password for every connection. If your private key has a passphrase, you may still need to unlock it unless an agent has already done so.</p><p>If ssh-copy-id is unavailable, you can install the public key manually in the remote account&#39;s ~/.ssh/authorized_keys file.</p><h3>A security detail worth remembering</h3><p>Never copy your private key to the server just to enable authentication.</p><p>The public key belongs on the remote machine. The private key should remain under your control.</p><p>Key-based authentication also does not automatically disable password authentication on the server. That is a separate server-side security decision.</p><h3>3. Use ssh-agent to Avoid Repeatedly Entering Your Key Passphrase</h3><p>You have generated an SSH key and protected it with a passphrase.</p><p>That’s good security, but repeatedly entering the passphrase during a long work session can become tedious.</p><p>An SSH agent can hold an unlocked key for you.</p><p>Start an agent in environments where one is not already running:</p><pre>eval &quot;$(ssh-agent -s)&quot;</pre><p>Add your key:</p><pre>ssh-add ~/.ssh/id_ed25519</pre><p>Enter the passphrase when prompted.</p><p>You can inspect the identities currently available to the agent:</p><pre>ssh-add -l</pre><p>Now SSH can use the loaded key for subsequent connections supported by that agent.</p><p>Modern desktop environments often start and manage an agent automatically, so you may not need to run these commands manually.</p><h3>Why this matters</h3><p>You retain the protection of an encrypted private key without having to unlock it for every connection.</p><p>For shared or untrusted machines, be careful about how long keys remain loaded and which processes can access the agent.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OCvyTxbU7zb1QYCabPK_QQ.png" /></figure><h3>4. Execute Commands on a Remote Server Without Opening a Shell</h3><p>Sometimes you don’t need an interactive terminal on the remote machine.</p><p>You simply need information or want to perform one operation.</p><p>For example:</p><pre>ssh workserver &quot;uptime&quot;</pre><p>This connects to the remote host, executes uptime, and returns the output.</p><p>Check disk space:</p><pre>ssh workserver &quot;df -h&quot;</pre><p>Check memory:</p><pre>ssh workserver &quot;free -h&quot;</pre><p>Check whether a particular service is active:</p><pre>ssh workserver &quot;systemctl is-active nginx&quot;</pre><p>The remote account must have permission to run the requested command.</p><p>You can also execute several commands:</p><pre>ssh workserver &quot;cd /var/log &amp;&amp; ls -lh&quot;</pre><p>The commands inside the quotes are interpreted by the remote shell.</p><h3>Run the same check on multiple servers</h3><p>If your SSH configuration contains several host aliases:</p><pre>for host in workserver testserver; do<br>    echo &quot;Checking $host&quot;<br>    ssh &quot;$host&quot; &quot;uptime&quot;<br>done</pre><p>This is a simple way to collect information from several machines.</p><p>For larger deployments, monitoring systems or configuration-management tools may be more appropriate. But for a small number of servers, SSH loops are often sufficient.</p><h3>5. Keep Long-Running Work Alive With tmux</h3><p>You SSH into a server, start a lengthy task, and then your internet connection drops.</p><p>What happens?</p><p>If the task is running directly in your interactive shell, the disconnection may cause the session and its processes to terminate. The exact behavior depends on the shell, process, and session configuration.</p><p>A useful solution is tmux.</p><p>On the remote server, start a session:</p><pre>tmux new -s work</pre><p>Run your command inside it:</p><pre>./long_running_task.sh</pre><p>To detach from the session while leaving it running, press:</p><pre>Ctrl+B, then D</pre><p>You return to the remote shell without closing the tmux session.</p><p>Later, reconnect to the server:</p><pre>ssh workserver</pre><p>List available sessions:</p><pre>tmux ls</pre><p>Reattach:</p><pre>tmux attach -t work</pre><p>Your terminal session, including its running foreground program, remains available.</p><h3>Important distinction</h3><p>tmux is not an SSH option. It is a terminal multiplexer that runs on the remote machine.</p><p>SSH provides the connection. tmux preserves the terminal session independently of that connection.</p><p>If the remote machine reboots or the process crashes, tmux cannot preserve the lost process.</p><h3>6. Transfer Files Securely With scp</h3><p>SSH is not limited to interactive sessions. You can use it to transfer files between computers.</p><p>To copy a local file to a remote server:</p><pre>scp report.txt workserver:/home/raja/</pre><p>To copy a remote file to your local machine:</p><pre>scp workserver:/home/raja/report.txt .</pre><p>To copy a directory recursively:</p><pre>scp -r project/ workserver:/home/raja/</pre><p>You can also specify a non-default port:</p><pre>scp -P 2222 report.txt production:/home/admin/</pre><p>Notice that scp uses uppercase -P for the port option.</p><h3>When should you use scp?</h3><p>Use it for straightforward file transfers.</p><p>If you regularly synchronize large directories, preserve metadata, or transfer only changed files, rsync may be more suitable.</p><p>For example:</p><pre>rsync -avh --progress project/ workserver:/home/raja/project/</pre><p>Both tools can use SSH for secure transport.</p><p>One practical distinction is that scp copies files, while rsync is designed to synchronize files and directory trees efficiently.</p><h3>7. Forward a Remote Port to Your Local Machine</h3><p>This is one of SSH’s most useful features for developers and administrators.</p><p>Suppose a web application is running on a remote server and listening on port 3000.</p><p>The service is not exposed directly to the public internet, but you want to access it from your own browser.</p><p>You can create a local port forward:</p><pre>ssh -L 8080:localhost:3000 workserver</pre><p>Leave this SSH session open.</p><p>Then open the following address on your local machine:</p><pre>http://localhost:8080</pre><p>The connection follows this path:</p><pre>Your browser<br>     |<br>     | localhost:8080<br>     v<br>Local SSH listener<br>     |<br>     | encrypted SSH connection<br>     v<br>Remote server<br>     |<br>     | localhost:3000<br>     v<br>Web application</pre><p>The important detail is that localhost:3000 in this command refers to the remote server&#39;s network environment, not your local computer.</p><p>This technique is called <strong>local port forwarding</strong>.</p><h3>When is this useful?</h3><ul><li>Accessing a development server on a remote machine</li><li>Inspecting an internal web dashboard</li><li>Connecting to a database that should not be publicly exposed</li><li>Testing services bound to the remote loopback interface</li></ul><p>Only forward services you are authorized to access. Keep the SSH connection protected, and avoid exposing the local forwarded port to other machines unless that is intentional.</p><h3>8. Reuse SSH Connections to Reduce Repeated Connection Overhead</h3><p>If you repeatedly run remote commands against the same server, SSH may spend time establishing a new connection for each command.</p><p>OpenSSH supports connection multiplexing, which allows multiple sessions to reuse an existing authenticated connection.</p><p>Add the following to ~/.ssh/config:</p><pre>Host workserver<br>    HostName 192.168.1.100<br>    User raja<br>    ControlMaster auto<br>    ControlPath ~/.ssh/cm-%C<br>    ControlPersist 10m</pre><p>Now run:</p><pre>ssh workserver</pre><p>Additional SSH connections to the same configured host can reuse the master connection while it remains available.</p><p>The settings mean:</p><ul><li>ControlMaster auto: Reuse or establish a master connection when appropriate.</li><li>ControlPath: Specify where the local control socket is stored.</li><li>ControlPersist 10m: Keep the master connection available for up to ten minutes after its original session closes, subject to the connection&#39;s state.</li></ul><p>This can reduce repeated connection setup overhead, especially when running scripts that issue many SSH commands.</p><h3>A security consideration</h3><p>The control socket is sensitive because it can allow access to an authenticated connection. Keep it in a directory with appropriate permissions, and avoid placing it in a shared location.</p><p>You can close a master connection explicitly:</p><pre>ssh -O exit workserver</pre><p>This works when a corresponding master connection is active and the configuration matches.</p><h3>9. Use SSH Configuration to Handle Different Ports and Connection Options</h3><p>Some servers listen on the default SSH port 22. Others use a different port or require a jump host.</p><p>You can specify a port directly:</p><pre>ssh -p 2222 raja@192.168.1.100</pre><p>Remember that SSH uses lowercase -p for the connection port.</p><p>For recurring connections, store the setting:</p><pre>Host production<br>    HostName 10.0.0.25<br>    User admin<br>    Port 2222</pre><p>Then:</p><pre>ssh production</pre><h3>What if the server is reachable only through another machine?</h3><p>OpenSSH supports jump hosts.</p><p>For example:</p><pre>Host bastion<br>    HostName bastion.example.com<br>    User raja</pre><pre>Host internal<br>    HostName 10.0.0.25<br>    User admin<br>    ProxyJump bastion</pre><p>Now:</p><pre>ssh internal</pre><p>SSH connects through the configured bastion host to reach the internal machine.</p><p>This is useful in environments where servers are isolated from direct public access.</p><p>The jump host must itself be reachable, and the network and SSH policies must permit the onward connection.</p><h3>10. Debug SSH Connections Instead of Guessing</h3><p>SSH failures can come from several places:</p><ul><li>Incorrect usernames or hostnames</li><li>Network connectivity problems</li><li>Wrong ports</li><li>Missing or incorrect private keys</li><li>Server-side authentication settings</li><li>Host key verification failures</li><li>File permission problems involving SSH keys</li></ul><p>Instead of repeatedly changing settings, increase the verbosity of the SSH client.</p><p>Run:</p><pre>ssh -v workserver</pre><p>For more diagnostic detail:</p><pre>ssh -vv workserver</pre><p>And, when needed:</p><pre>ssh -vvv workserver</pre><p>These options reveal more information about connection setup, key selection, authentication attempts, and protocol negotiation.</p><p>You can also test whether a TCP connection can be established to a particular SSH port:</p><pre>nc -vz 192.168.1.100 22</pre><p>This requires nc (netcat) to be installed. It tests basic reachability to the port, not whether SSH authentication will succeed.</p><h3>Check host key warnings carefully</h3><p>If SSH reports that a server’s host key has changed, do not blindly disable host key checking or delete the old key.</p><p>The change may be legitimate, such as after a server rebuild, but it can also indicate a security problem.</p><p>Verify the new host key through a trusted channel before accepting it.</p><p><strong>Good troubleshooting begins with evidence, not with disabling security checks.</strong></p><h3>The Bigger Picture: Turn SSH Into a Workflow</h3><p>These techniques become especially useful when combined.</p><p>For example, you could configure a host alias, connect using a key, run a remote command, and capture its output:</p><pre>ssh workserver &quot;df -h&quot; &gt; disk_report.txt</pre><p>Or use SSH with a remote session that survives a dropped connection:</p><pre>SSH<br> |<br> v<br>Remote Linux server<br> |<br> v<br>tmux session<br> |<br> v<br>Long-running task</pre><p>Or access a private application through a local tunnel:</p><pre>Browser<br>   |<br>   v<br>localhost:8080<br>   |<br>   v<br>SSH tunnel<br>   |<br>   v<br>Remote localhost:3000</pre><p>The goal is not to use every SSH feature. It is to recognize which feature solves the problem in front of you.</p><h3>Final Thoughts</h3><p>SSH is much more than a command for opening a remote terminal.</p><p>With a well-configured SSH client, you can simplify server access, automate remote checks, transfer files, maintain long-running terminal sessions, reach private services, and diagnose connection failures.</p><p>Start with these habits:</p><ul><li>Use ~/.ssh/config for recurring hosts.</li><li>Prefer key-based authentication with a protected private key.</li><li>Use ssh-agent when appropriate.</li><li>Execute remote commands directly when an interactive shell isn’t needed.</li><li>Use tmux for terminal sessions that should survive disconnections.</li><li>Choose scp or rsync based on your transfer needs.</li><li>Use port forwarding for authorized access to private services.</li><li>Consider connection multiplexing for repeated SSH operations.</li><li>Configure jump hosts when network architecture requires them.</li><li>Use verbose diagnostics instead of disabling security protections.</li></ul><p>The real advantage comes from reducing repetitive work while maintaining control over access and security.</p><p><strong>The next time you type </strong><strong>ssh user@server, consider whether you could make that connection simpler, more secure, or easier to troubleshoot.</strong></p><p>That’s how you turn SSH from a basic remote-login tool into a practical part of your everyday Linux workflow.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ad6477ff1d39" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[10 Linux Permission Skills That Separate Pros From Average Users]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@ishaaq.raja/10-linux-permission-skills-that-separate-pros-from-average-users-34fb33b91920?source=rss-bd02ebfbd1a8------2"><img src="https://cdn-images-1.medium.com/max/2600/1*zcJfS8OhhVSk1e4N9Gg5IA.png" width="12600"></a></p><p class="medium-feed-snippet">Knowing chmod 755 is easy. Understanding why permissions fail, how ownership works, and how to secure shared directories is what makes you&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/@ishaaq.raja/10-linux-permission-skills-that-separate-pros-from-average-users-34fb33b91920?source=rss-bd02ebfbd1a8------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@ishaaq.raja/10-linux-permission-skills-that-separate-pros-from-average-users-34fb33b91920?source=rss-bd02ebfbd1a8------2</link>
            <guid isPermaLink="false">https://medium.com/p/34fb33b91920</guid>
            <category><![CDATA[bash]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[linux]]></category>
            <dc:creator><![CDATA[Raja ishaq Nabi Khan]]></dc:creator>
            <pubDate>Sat, 24 Oct 2026 10:02:04 GMT</pubDate>
            <atom:updated>2026-10-24T10:28:40.330Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Stop Reading Text Files Manually: 7 Linux Tricks to Find What Matters Faster]]></title>
            <link>https://medium.com/@ishaaq.raja/stop-reading-text-files-manually-7-linux-tricks-to-find-what-matters-faster-af30100bca89?source=rss-bd02ebfbd1a8------2</link>
            <guid isPermaLink="false">https://medium.com/p/af30100bca89</guid>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[linux-tutorial]]></category>
            <category><![CDATA[deep-learning]]></category>
            <category><![CDATA[trending]]></category>
            <dc:creator><![CDATA[Raja ishaq Nabi Khan]]></dc:creator>
            <pubDate>Fri, 09 Oct 2026 19:24:10 GMT</pubDate>
            <atom:updated>2026-10-09T19:24:10.426Z</atom:updated>
            <content:encoded><![CDATA[<p>In the first article, <a href="https://medium.com/@ishaaq.raja/10-linux-commands-every-power-user-should-know-dff885ad99d5?sharedUserId=ishaaq.raja"><strong>10 Linux Commands Every Power User Should Know</strong></a>, I explored essential commands for searching files, managing processes, monitoring logs, transferring data, and controlling permissions.</p><p>In the second article, <a href="https://medium.com/@ishaaq.raja/10-linux-techniques-that-separate-beginners-from-power-users-7eaf2e3e7f3b?sharedUserId=ishaaq.raja"><strong>10 Linux Techniques That Separate Beginners From Power Users</strong></a>, I moved beyond individual commands to explain how pipes, redirection, command substitution, conditional execution, and background processes make the command line more powerful.</p><p>In the third article, <a href="https://medium.com/@ishaaq.raja/10-bash-one-liners-that-actually-save-time-18ec70d8646a?sharedUserId=ishaaq.raja"><strong>10 Bash Time-Saver One-Liners That Turn Naive Users into Pro Users</strong></a>, I demonstrated how Bash can automate repetitive tasks involving files, directories, filenames, and text.</p><p>Now, it’s time to focus on a specific skill that connects all three topics: <strong>text processing</strong>.</p><p>Imagine you have a server log containing thousands of lines, a configuration file with hundreds of settings, or a text file containing records you need to analyze.</p><p>You want to find specific entries, extract a few columns, replace text, remove duplicates, or calculate a total.</p><p>Opening the file and processing everything manually is rarely the most efficient approach.</p><p>Linux provides tools that let you perform these operations directly from the terminal, often with just one command.</p><p>In this article, we’ll explore seven useful text-processing tools:</p><ul><li>grep</li><li>cut</li><li>awk</li><li>sed</li><li>sort</li><li>uniq</li><li>wc</li></ul><p>Let’s get started.</p><p>1. grep: Find Exactly What You&#39;re Looking For</p><p>You’ve probably used grep to search for text. But searching becomes much more useful when you understand how to apply it to real-world problems.</p><p>Imagine a file named server.log containing:</p><pre>2026-10-10 09:12:03 INFO Server started<br>2026-10-10 09:12:08 ERROR Connection failed<br>2026-10-10 09:12:12 INFO Request received<br>2026-10-10 09:12:19 ERROR Authentication failed<br>2026-10-10 09:12:25 WARNING Disk usage high</pre><p>To find errors:</p><pre>grep &quot;ERROR&quot; server.log</pre><p>To search without worrying about uppercase or lowercase:</p><pre>grep -i &quot;error&quot; server.log</pre><p>To display line numbers:</p><pre>grep -n &quot;ERROR&quot; server.log</pre><p>To find lines that do not contain a particular pattern:</p><pre>grep -v &quot;INFO&quot; server.log</pre><p>You can also search using regular expressions.</p><p>For example, to find lines beginning with a date:</p><pre>grep &#39;^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}&#39; server.log</pre><p>The ^ anchors the pattern to the beginning of a line.</p><p><strong>When to use it:</strong> Searching logs, locating configuration settings, filtering records, and finding patterns in large text files.</p><h3>2. cut: Extract Only the Columns You Need</h3><p>Suppose you have a comma-separated file named employees.csv:</p><pre>name,department,salary<br>Alice,Engineering,75000<br>Bob,Marketing,62000<br>Charlie,Engineering,81000<br>Diana,Finance,70000</pre><p>You want only the employee names.</p><p>Use:</p><pre>cut -d&#39;,&#39; -f1 employees.csv</pre><p>Here:</p><ul><li>-d&#39;,&#39; specifies the comma delimiter.</li><li>-f1 selects the first field.</li></ul><p>To extract names and salaries:</p><pre>cut -d&#39;,&#39; -f1,3 employees.csv</pre><p>To extract the second field:</p><pre>cut -d&#39;,&#39; -f2 employees.csv</pre><p>You can also extract character positions rather than delimited fields:</p><pre>cut -c1-10 file.txt</pre><p>This displays the first ten characters of each line.</p><h3>An important limitation</h3><p>cut works well with simple, consistently delimited text. It is not a full CSV parser.</p><p>For example, consider:</p><pre>name,description,salary<br>Alice,&quot;Engineering, Research&quot;,75000</pre><p>Because the description contains a comma inside quotation marks, cut -d&#39;,&#39; will not correctly interpret the CSV fields.</p><p>For complex CSV files, use a proper CSV parser.</p><p><strong>When to use it:</strong> Extracting fields from simple CSV files, tab-separated tables, and consistently structured text.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4EcxQ0vaIVfGxilS4CnZ_A.png" /></figure><h3>3. awk: Filter Records, Extract Fields, and Perform Calculations</h3><p>If you learn only one tool specifically for structured text processing, consider learning awk.</p><p>It treats each line as a record and, by default, splits that line into whitespace-separated fields.</p><p>Consider this file:</p><pre>Alice Engineering 75000<br>Bob Marketing 62000<br>Charlie Engineering 81000<br>Diana Finance 70000</pre><p>Save it as employees.txt.</p><p>To print only the first column:</p><pre>awk &#39;{print $1}&#39; employees.txt</pre><p>Output:</p><pre>Alice<br>Bob<br>Charlie<br>Diana</pre><p>To print names and salaries:</p><pre>awk &#39;{print $1, $3}&#39; employees.txt</pre><p>Now suppose you want only employees earning more than 70,000:</p><pre>awk &#39;$3 &gt; 70000&#39; employees.txt</pre><p>You can calculate the average salary:</p><pre>awk &#39;{sum += $3; count++} END {if (count) print sum/count}&#39; employees.txt</pre><p>This works in two stages:</p><ol><li>For every line, add the third field to sum and increment count.</li><li>After processing the file, calculate the average.</li></ol><p>You can also calculate the total:</p><pre>awk &#39;{sum += $3} END {print sum}&#39; employees.txt</pre><h3>Why awk matters</h3><p>You can use it to filter records, extract columns, count entries, calculate totals, and generate summaries.</p><p>For small, structured-text tasks, it can eliminate the need to write a separate script.</p><p><strong>When to use it:</strong> Working with tables, processing delimited records, filtering rows by conditions, and performing calculations directly in the terminal.</p><h3>4. sed: Replace Text Without Opening a File</h3><p>Suppose a configuration file contains:</p><pre>server=old-server<br>port=8080<br>environment=production</pre><p>You want to replace old-server with new-server.</p><p>Use:</p><pre>sed &#39;s/old-server/new-server/g&#39; config.txt</pre><p>This prints the modified text to the terminal. It does not change the original file.</p><p>The substitution syntax is:</p><pre>s/old-text/new-text/g</pre><p>The final g means that all non-overlapping matches on each line are replaced, rather than only the first match.</p><p>To modify the file directly:</p><pre>sed -i.bak &#39;s/old-server/new-server/g&#39; config.txt</pre><p>On GNU/Linux, this changes the file and creates a backup named config.txt.bak.</p><p>To remove blank lines from the displayed output:</p><pre>sed &#39;/^[[:space:]]*$/d&#39; config.txt</pre><p>To print only lines 10 through 20:</p><pre>sed -n &#39;10,20p&#39; config.txt</pre><h3>A word of caution</h3><p>Commands using sed -i modify files directly. Test the transformation on a copy or create a backup before applying it to important configuration files.</p><p><strong>When to use it:</strong> Replacing text, removing unwanted lines, and applying simple transformations to one or more text files.</p><h3>5. sort: Put Records in the Order You Need</h3><p>Sorting is useful when you want to organize data, identify repeated entries, or prepare records for further processing.</p><p>Suppose numbers.txt contains:</p><pre>100<br>20<br>9<br>50</pre><p>Run:</p><pre>sort numbers.txt</pre><p>The default is lexicographic sorting, not numerical sorting. Therefore, the result may not be the numerical order you expect.</p><p>For numerical sorting:</p><pre>sort -n numbers.txt</pre><p>Output:</p><pre>9<br>20<br>50<br>100</pre><p>For reverse numerical order:</p><pre>sort -nr numbers.txt</pre><p>For a tab-separated file, you can sort by the second column:</p><pre>sort -t $&#39;\t&#39; -k2,2 data.tsv</pre><p>Here:</p><ul><li>-t specifies the delimiter.</li><li>-k2,2 selects the second field as the sort key.</li></ul><p>To sort that field numerically in descending order:</p><pre>sort -t $&#39;\t&#39; -k2,2nr data.tsv</pre><p><strong>When to use it:</strong> Ordering records, sorting by columns, preparing data for duplicate counting, and identifying the largest or smallest values.</p><h3>6. uniq: Identify Repeated Entries</h3><p>Suppose you have a file containing:</p><pre>apple<br>banana<br>apple<br>orange<br>banana<br>apple</pre><p>You might expect:</p><pre>uniq fruits.txt</pre><p>to remove every duplicate.</p><p>It doesn’t.</p><p>uniq compares <strong>adjacent lines only</strong>. In the example above, the repeated entries are separated, so they will not all be collapsed.</p><p>To identify unique entries regardless of their original order, sort first:</p><pre>sort fruits.txt | uniq</pre><p>To count occurrences:</p><pre>sort fruits.txt | uniq -c</pre><p>To display the most frequent entries first:</p><pre>sort fruits.txt | uniq -c | sort -nr</pre><p>The result will resemble:</p><pre>3 apple<br>2 banana<br>1 orange</pre><p>This is a useful pattern to remember:</p><pre>sort file.txt | uniq -c | sort -nr</pre><p>It sorts the input, counts adjacent identical lines, and then sorts the counts numerically in descending order.</p><p><strong>When to use it:</strong> Finding repeated values, counting categories, and identifying frequent entries in logs or text files.</p><h3>7. wc: Count Lines, Words, and Characters</h3><p>Sometimes you don’t need to inspect a file’s contents. You just need to know how much data it contains.</p><p>That’s where wc comes in.</p><p>Count lines:</p><pre>wc -l server.log</pre><p>Count words:</p><pre>wc -w document.txt</pre><p>Count bytes:</p><pre>wc -c document.txt</pre><p>Count characters:</p><pre>wc -m document.txt</pre><p>These last two are different: a multibyte character can occupy more than one byte.</p><p>You can also count the number of lines matching a pattern:</p><pre>grep -c &quot;ERROR&quot; server.log</pre><p>Or count files in the current directory using Bash filename expansion:</p><pre>printf &#39;%s\n&#39; * | wc -l</pre><p>This last example counts the entries matched by *, including directories and hidden-file exclusions inherent to the default expansion. It is not a recursive file count.</p><p>For a count of regular files recursively, use:</p><pre>find . -type f | wc -l</pre><p><strong>When to use it:</strong> Counting lines, measuring text, estimating the size of a dataset, and checking the output of a processing step.</p><h3>Put the Commands Together</h3><p>Individual commands are useful. Combining them lets you solve more interesting problems.</p><p>Imagine you have a log file and want to identify the ten most frequent error messages.</p><p>You could run:</p><pre>grep &quot;ERROR&quot; server.log | sort | uniq -c | sort -nr | head -n 10</pre><p>Let’s break that down:</p><p>CommandPurposegrep &quot;ERROR&quot;Select lines containing ERRORsortPlace identical lines next to one anotheruniq -cCount adjacent identical linessort -nrSort counts in descending numerical orderhead -n 10Display the first ten results</p><p>This is a compact workflow, but it is important to understand what it actually counts.</p><p>It counts <strong>identical complete log lines</strong>, not necessarily distinct error types. If each line contains a different timestamp, the same underlying error may appear as multiple separate entries.</p><p>If you want to group messages by error category, you first need to extract or normalize the relevant part of each line.</p><p>That is where tools such as awk and sed become useful.</p><p>The broader idea is simple:</p><p><strong>Search the data, extract the relevant information, transform it, organize it, and summarize the result.</strong></p><p>You can apply this approach to log files, configuration files, exported tables, and many other kinds of structured text.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=af30100bca89" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[10 Bash One-Liners That Actually Save Time]]></title>
            <link>https://medium.com/@ishaaq.raja/10-bash-one-liners-that-actually-save-time-18ec70d8646a?source=rss-bd02ebfbd1a8------2</link>
            <guid isPermaLink="false">https://medium.com/p/18ec70d8646a</guid>
            <category><![CDATA[linux-tutorial]]></category>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[trending]]></category>
            <category><![CDATA[machine-learning]]></category>
            <dc:creator><![CDATA[Raja ishaq Nabi Khan]]></dc:creator>
            <pubDate>Thu, 01 Oct 2026 16:42:28 GMT</pubDate>
            <atom:updated>2026-10-02T10:43:26.815Z</atom:updated>
            <content:encoded><![CDATA[<h3>10 Bash Time-Saver One-Liners That Turn Naive Users into Pro Users</h3><p>If you have been following this series, you have already seen two sides of working efficiently in Linux.</p><p>The first article, <a href="https://medium.com/@ishaaq.raja/10-linux-commands-every-power-user-should-know-dff885ad99d5?sharedUserId=ishaaq.raja"><strong>10 Linux Commands Every Power User Should Know</strong></a><strong>,</strong> focused on individual commands such as grep, find, ssh, rsync, tail, df, du, ps, kill, and chmod.</p><p>The second article, <a href="https://medium.com/@ishaaq.raja/10-linux-techniques-that-separate-beginners-from-power-users-7eaf2e3e7f3b?sharedUserId=ishaaq.raja"><strong>10 Linux Techniques That Separate Beginners From Power Users</strong></a><strong> ,</strong> moved beyond individual commands and covered pipes, redirection, stdin/stdout/stderr, command substitution, conditional execution, background jobs, tee, xargs, and awk.</p><p>Instead, let’s look at something more practical:</p><blockquote><strong><em>Small Bash one-liners that eliminate repetitive work.</em></strong></blockquote><blockquote>These aren’t commands you need to memorize for an exam. They are shortcuts you can reach for when you encounter an everyday problem in the terminal.</blockquote><h3>1. Create Multiple Files or Directories With Brace Expansion</h3><p>Suppose you need to create three directories:</p><pre>mkdir reports logs backups</pre><p>That’s fine.</p><p>But Bash can generate the names for you:</p><pre>mkdir {reports,logs,backups}</pre><p>You can also generate sequences:</p><pre>mkdir project_{01..05}</pre><p>This creates:</p><pre>project_01<br>project_02<br>project_03<br>project_04<br>project_05</pre><p>The same technique works with files:</p><pre>touch file_{1..10}.txt</pre><p>You get:</p><pre>file_1.txt<br>file_2.txt<br>...<br>file_10.txt</pre><p>You can even combine expansions:</p><pre>touch report_{2024..2026}_{jan,apr,jul,oct}.txt</pre><p>That’s a lot of filenames generated from a single command.</p><h3>Why it saves time</h3><p>Whenever you notice yourself typing a repetitive sequence of filenames, ask:</p><blockquote><strong><em>Can Bash generate this pattern for me?</em></strong></blockquote><p>Often, the answer is yes.</p><h3>2. Rename Files Using Bash Parameter Expansion</h3><p>Suppose you have:</p><pre>report_old.txt<br>data_old.txt<br>summary_old.txt</pre><p>and want to replace _old with _new.</p><p>Instead of manually renaming each file:</p><pre>for f in *_old.txt; do mv &quot;$f&quot; &quot;${f/_old/_new}&quot;; done</pre><p>The important part is:</p><pre>${f/_old/_new}</pre><p>Bash takes the filename stored in $f and replaces _old with _new.</p><p>The result:</p><pre>report_new.txt<br>data_new.txt<br>summary_new.txt</pre><p>You can also remove part of a filename:</p><pre>for f in *.backup; do mv &quot;$f&quot; &quot;${f%.backup}&quot;; done</pre><p>For example:</p><pre>report.txt.backup</pre><p>becomes:</p><pre>report.txt</pre><p>This is extremely useful when dealing with batches of consistently named files.</p><h3>3. Extract the Filename or Directory From a Path</h3><p>Suppose you have:</p><pre>path=&quot;/home/user/projects/report.txt&quot;</pre><p>You can extract the filename:</p><pre>basename &quot;$path&quot;</pre><p>Result:</p><pre>report.txt</pre><p>Or extract the directory:</p><pre>dirname &quot;$path&quot;</pre><p>Result:</p><pre>/home/user/projects</pre><p>You can combine them:</p><pre>echo &quot;$(basename &quot;$path&quot;) is located in $(dirname &quot;$path&quot;)&quot;</pre><p>This becomes especially useful in shell scripts where you don’t know the path in advance.</p><h3>4. Find the Absolute Path of a File</h3><p>Relative paths can become confusing.</p><p>For example:</p><pre>./data/results.txt</pre><p>What is the actual location?</p><p>Use:</p><pre>realpath ./data/results.txt</pre><p>You might get:</p><pre>/home/raja/project/data/results.txt</pre><p>This is useful when:</p><ul><li>writing scripts</li><li>passing files between programs</li><li>debugging path problems</li><li>working with symbolic links</li><li>recording reproducible file locations</li></ul><p>A related command is:</p><pre>readlink -f ./data/results.txt</pre><p>On systems where it is supported, this resolves the path to its canonical absolute location.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Z8KjorpvSEkH3xmLSlrSNw.png" /></figure><h3>5. Replace Text Directly Inside Multiple Files</h3><p>Suppose several configuration files contain:</p><pre>server=old-server</pre><p>and you need:</p><pre>server=new-server</pre><p>You can use:</p><pre>sed -i &#39;s/server=old-server/server=new-server/g&#39; *.conf</pre><p>The -i option modifies the files directly.</p><p>Before using it on important files, test the substitution without -i:</p><pre>sed &#39;s/server=old-server/server=new-server/g&#39; example.conf</pre><p>If the output looks correct, then use -i.</p><p>For an additional safety measure, some systems support:</p><pre>sed -i.bak &#39;s/server=old-server/server=new-server/g&#39; *.conf</pre><p>This creates backup copies with .bak.</p><h3>Why this saves time</h3><p>Instead of opening ten configuration files, editing each one, saving them, and repeating the process, you can perform the same transformation across the entire set.</p><h3>6. Quickly Compare Two Files</h3><p>You don’t always need to open two files manually to see what’s different.</p><p>Use:</p><pre>diff file1.txt file2.txt</pre><p>For a more readable side-by-side comparison:</p><pre>diff -y file1.txt file2.txt</pre><p>If you’re comparing directories:</p><pre>diff -rq directory1 directory2</pre><p>This tells you which files differ without dumping their entire contents.</p><p>For example:</p><pre>Files directory1/config.txt and directory2/config.txt differ<br>Only in directory1: old.log<br>Only in directory2: new.log</pre><p>This is particularly useful when troubleshooting configuration changes or checking whether two directory trees are actually identical.</p><h3>7. Run a Command Repeatedly With watch</h3><p>Sometimes you don’t need a complicated monitoring system.</p><p>You simply want to run the same command every few seconds.</p><p>For example:</p><pre>watch -n 2 &#39;date&#39;</pre><p>The command runs every two seconds.</p><p>You can use it with system information:</p><pre>watch -n 2 &#39;free -h&#39;</pre><p>Or monitor a directory:</p><pre>watch -n 1 &#39;ls -lh&#39;</pre><p>You can even monitor a particular value:</p><pre>watch -n 2 &#39;df -h /&#39;</pre><p>Instead of repeatedly typing the same command and clearing your terminal, watch turns it into a simple live display.</p><p>Press:</p><pre>Ctrl + C</pre><p>to stop it.</p><h3>8. Find and Process Only the Files You Want</h3><p>The previous article introduced find, but there is more to it than simply locating files.</p><p>For example, suppose you want to list files modified within the last day:</p><pre>find . -type f -mtime -1</pre><p>You can combine file properties with an action.</p><p>For example, find empty files:</p><pre>find . -type f -empty</pre><p>Find files larger than 500 MB:</p><pre>find . -type f -size +500M</pre><p>Find files with a particular extension and print their sizes:</p><pre>find . -type f -name &quot;*.log&quot; -exec ls -lh {} \;</pre><p>The important concept here is:</p><pre>find<br>  ↓<br>identify exactly what you want<br>  ↓<br>perform an action</pre><p>This is much safer than applying an operation blindly to an entire directory.</p><h3>9. Use Bash Defaults to Make Scripts More Robust</h3><p>This is one of the most useful Bash features that many beginners overlook.</p><p>Suppose your script expects a variable:</p><pre>echo &quot;$NAME&quot;</pre><p>What happens if $NAME hasn’t been defined?</p><p>You can provide a default:</p><pre>echo &quot;${NAME:-Unknown}&quot;</pre><p>If NAME exists, its value is used.</p><p>If it doesn’t, Bash uses:</p><pre>Unknown</pre><p>You can also set a default:</p><pre>NAME=&quot;${NAME:-Raja}&quot;</pre><p>Now NAME becomes Raja if it wasn&#39;t already defined.</p><p>Another useful form is:</p><pre>echo &quot;${FILE:?FILE variable is required}&quot;</pre><p>If FILE isn&#39;t defined, Bash produces an error instead of silently continuing.</p><p>This is especially useful in scripts where missing variables could cause incorrect results.</p><h3>10. Process a Batch of Files With a Bash Loop</h3><p>One of the most useful things you can do with Bash is turn a repetitive manual task into a one-liner.</p><p>Suppose you have:</p><pre>file1.txt<br>file2.txt<br>file3.txt</pre><p>and want to create a compressed version of each file.</p><p>You could write:</p><pre>for f in *.txt; do gzip &quot;$f&quot;; done</pre><p>That’s one line, but it represents a complete workflow:</p><pre>Find matching files<br>       ↓<br>Take one filename<br>       ↓<br>Run the command<br>       ↓<br>Move to the next file<br>       ↓<br>Repeat</pre><p>You can substitute almost any operation.</p><p>For example:</p><pre>for f in *.log; do echo &quot;$f&quot;; done</pre><p>Or:</p><pre>for f in *.txt; do cp &quot;$f&quot; &quot;backup_$f&quot;; done</pre><p>Or:</p><pre>for f in *.jpg; do mv &quot;$f&quot; &quot;${f%.jpg}.jpeg&quot;; done</pre><p>This is where Bash starts becoming an automation language rather than simply a place to type commands.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=18ec70d8646a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[10 Linux Techniques That Separate Beginners From Power Users]]></title>
            <link>https://medium.com/@ishaaq.raja/10-linux-techniques-that-separate-beginners-from-power-users-7eaf2e3e7f3b?source=rss-bd02ebfbd1a8------2</link>
            <guid isPermaLink="false">https://medium.com/p/7eaf2e3e7f3b</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[trending]]></category>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[linux-tutorial]]></category>
            <dc:creator><![CDATA[Raja ishaq Nabi Khan]]></dc:creator>
            <pubDate>Sat, 26 Sep 2026 13:39:53 GMT</pubDate>
            <atom:updated>2026-09-26T13:39:53.932Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Knowing Linux commands is useful. Knowing how to combine them is where things start getting interesting.</em></p><p>In my previous article, <strong>“</strong><a href="https://medium.com/@ishaaq.raja/10-linux-commands-every-power-user-should-know-dff885ad99d5?sharedUserId=ishaaq.raja"><strong>10 Linux Commands Every Power User Should Know</strong></a><strong>,”</strong> I covered practical commands such as grep, find, history, curl, ssh, rsync, tail, df, du, ps, kill, and chmod.</p><p>But there is a limit to learning commands one by one.</p><p>A Linux user who knows 50 commands but runs them independently can still be less effective than someone who knows 15 commands and understands how to <strong>combine them</strong>.</p><p>The real power of the Linux command line comes from techniques such as pipes, redirection, command substitution, background execution, and text processing.</p><p>So, in this article, we move from:</p><blockquote><strong><em>“Do you know the command?”</em></strong></blockquote><p>to:</p><blockquote><strong><em>“Do you know how to use the command?”</em></strong></blockquote><p>Here are 10 Linux techniques that are worth mastering.</p><h3>1. Pipes |: Make One Command Feed Another</h3><p>The pipe is probably the most important concept to understand if you want to become comfortable with Linux.</p><p>A pipe takes the <strong>standard output of one command and sends it as standard input to another command</strong>.</p><p>For example:</p><pre>cat access.log | grep &quot;404&quot;</pre><p>The output from cat becomes the input for grep.</p><p>But you don’t actually need cat here. A better version is:</p><pre>grep &quot;404&quot; access.log</pre><p>The real power appears when you chain several operations:</p><pre>grep &quot;404&quot; access.log | sort | uniq -c</pre><p>Now the workflow is:</p><pre>access.log<br>    ↓<br>grep<br>    ↓<br>sort<br>    ↓<br>uniq -c<br>    ↓<br>counted results</pre><p>You can continue:</p><pre>grep &quot;404&quot; access.log | sort | uniq -c | sort -nr</pre><p>Now you’re asking Linux to:</p><ol><li>Find lines containing 404</li><li>Sort them</li><li>Count identical lines</li><li>Sort the counts numerically in reverse order</li></ol><p>This is one of the fundamental ideas behind the Unix philosophy:</p><blockquote><strong><em>Build small tools that do one thing well, then combine them.</em></strong></blockquote><h3>2. Redirection: Control Where Your Output Goes</h3><p>Normally, a command prints its output to your terminal.</p><p>But you can redirect that output to a file.</p><h3>&gt;</h3><pre>ls -lah &gt; files.txt</pre><p>Instead of displaying the result, Linux writes it to files.txt.</p><p>Be careful:</p><pre>&gt; files.txt</pre><p><strong>overwrites</strong> the existing contents.</p><h3>&gt;&gt;</h3><p>If you want to append instead:</p><pre>date &gt;&gt; activity.log</pre><p>This adds the date to the end of the file without replacing what is already there.</p><p>So:</p><pre>&gt;   overwrite<br>&gt;&gt;  append</pre><p>This becomes particularly useful when building scripts and keeping logs.</p><p>For example:</p><pre>echo &quot;Pipeline started&quot; &gt; pipeline.log<br>echo &quot;Step 1 completed&quot; &gt;&gt; pipeline.log<br>echo &quot;Step 2 completed&quot; &gt;&gt; pipeline.log</pre><h3>3. Understand stdin, stdout, and stderr</h3><p>This is one of those Linux concepts that seems complicated until you see the model.</p><p>Every normal Linux process has three standard streams:</p><pre>stdin   → 0 → input<br>stdout  → 1 → normal output<br>stderr  → 2 → error output</pre><p>Think of them as three channels.</p><p>By default:</p><pre>Keyboard ──→ stdin ──→ command ──→ stdout ──→ terminal<br>                              \<br>                               └── stderr ──→ terminal</pre><p>You can redirect them separately.</p><p>Redirect standard output</p><pre>command &gt; output.txt</pre><h3>Redirect errors</h3><pre>command 2&gt; errors.txt</pre><h3>Redirect both</h3><pre>command &gt; output.txt 2&gt;&amp;1</pre><p>This is extremely useful when running long analyses.</p><p>For example:</p><pre>./pipeline.sh &gt; pipeline.log 2&gt;&amp;1</pre><p>Now both normal output and error messages are captured in the same log.</p><p>This becomes even more useful when combined with background execution.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rmtF2813coj3TmkBPWhv2g.png" /></figure><h3>4. Command Substitution: Use the Output of One Command Inside Another</h3><p>Suppose you want to create a directory named after today’s date.</p><p>You could use:</p><pre>mkdir 2026-09-17</pre><p>But Linux can generate the date dynamically:</p><pre>mkdir &quot;$(date +%Y-%m-%d)&quot;</pre><p>The part inside:</p><pre>$(...)</pre><p>is executed first.</p><p>Its output is then inserted into the surrounding command.</p><p>For example:</p><pre>echo &quot;Today is $(date)&quot;</pre><p>might produce:</p><pre>Today is Thu Sep 17 10:30:00 IST 2026</pre><p>Another example:</p><pre>echo &quot;There are $(wc -l &lt; file.txt) lines&quot;</pre><p>This is particularly useful in shell scripts because commands can become dynamic rather than hard-coded.</p><h3>5. &amp;&amp; vs ;: Control What Happens Next</h3><p>These two operators look similar but behave differently.</p><h3>Semicolon ;</h3><pre>command1 ; command2</pre><p>means:</p><blockquote><em>Run </em><em>command2 after </em><em>command1, regardless of whether </em><em>command1 succeeded.</em></blockquote><p>For example:</p><pre>mkdir results ; echo &quot;Done&quot;</pre><p>Even if creating the directory fails, the second command is still attempted.</p><h3>&amp;&amp;</h3><pre>command1 &amp;&amp; command2</pre><p>means:</p><blockquote><em>Run </em><em>command2 only if </em><em>command1 succeeds.</em></blockquote><p>For example:</p><pre>mkdir results &amp;&amp; echo &quot;Directory created&quot;</pre><p>This is much safer when commands depend on each other.</p><p>You can chain several operations:</p><pre>mkdir results &amp;&amp; cd results &amp;&amp; touch output.txt</pre><p>The workflow stops when one command fails.</p><p>A useful mental model is:</p><pre>;   → do this, then do that</pre><pre>&amp;&amp;  → do this successfully, then do that</pre><h3>6. Background Processes: Don’t Tie Up Your Terminal</h3><p>Suppose you start a long-running command:</p><pre>./long_pipeline.sh</pre><p>Your terminal is now occupied until the process finishes.</p><p>You can place it in the background with:</p><pre>./long_pipeline.sh &amp;</pre><p>The &amp; tells the shell to run the command asynchronously.</p><p>You can inspect background jobs with:</p><pre>jobs</pre><p>And bring one back to the foreground with:</p><pre>fg</pre><p>Or send it back to the background with:</p><pre>bg</pre><p>For a job that needs to keep running after you disconnect from the terminal, nohup is another useful technique:</p><pre>nohup ./long_pipeline.sh &gt; pipeline.log 2&gt;&amp;1 &amp;</pre><p>This combines several techniques from this article:</p><ul><li>nohup → protects the process from a hangup</li><li>&gt; → redirects output</li><li>2&gt;&amp;1 → redirects errors to the same log</li><li>&amp; → runs the process in the background</li></ul><p>That’s exactly what I mean by <strong>combining techniques rather than memorizing commands</strong>.</p><h3>7. tee: See the Output and Save It at the Same Time</h3><p>Sometimes you want output to appear on your screen <strong>and</strong> be saved to a file.</p><p>That’s where tee is useful.</p><pre>ls -lah | tee directory_listing.txt</pre><p>The output is displayed in the terminal while simultaneously being written to:</p><pre>directory_listing.txt</pre><p>You can also append:</p><pre>command | tee -a log.txt</pre><p>This is useful for monitoring scripts and pipelines where you don’t want to choose between seeing output and recording it.</p><p>For example:</p><pre>./pipeline.sh 2&gt;&amp;1 | tee pipeline.log</pre><p>Now you can watch the pipeline while keeping a permanent record.</p><h3>8. xargs: Turn Output Into Arguments</h3><p>xargs is one of the commands that initially looks strange but becomes extremely powerful.</p><p>Suppose you have:</p><pre>sample1.txt<br>sample2.txt<br>sample3.txt</pre><p>You can do:</p><pre>cat files.txt | xargs rm</pre><p>Conceptually:</p><pre>files.txt<br>   ↓<br>xargs<br>   ↓<br>rm sample1.txt sample2.txt sample3.txt</pre><p>xargs takes input and constructs commands from it.</p><p>A more useful example:</p><pre>find . -name &quot;*.log&quot; -print0 | xargs -0 grep &quot;ERROR&quot;</pre><p>This searches the matching log files for ERROR.</p><p>The -0 combination is important when filenames may contain spaces or other special characters.</p><p>xargs is particularly useful when the output of one command needs to become the <strong>arguments</strong> of another command.</p><h3>9. Use awk for Structured Text Instead of Manually Editing Files</h3><p>Linux becomes extremely powerful when you start treating text files as data.</p><p>Suppose you have:</p><pre>sample   reads    status<br>A01      1200000  PASS<br>A02       450000  FAIL<br>A03       980000  PASS</pre><p>You can extract the first column with:</p><pre>awk &#39;{print $1}&#39; results.txt</pre><p>Or select rows:</p><pre>awk &#39;$3 == &quot;PASS&quot;&#39; results.txt</pre><p>Or print specific columns:</p><pre>awk &#39;{print $1, $2}&#39; results.txt</pre><p>You can even perform calculations:</p><pre>awk &#39;{sum += $2} END {print sum}&#39; results.txt</pre><p>This is why awk is so useful for tabular data.</p><p>You don’t necessarily need Python or R for every small text-processing task.</p><p>Sometimes:</p><pre>awk</pre><p>is enough.</p><h3>10. Build Commands Incrementally Instead of Writing One Giant Command</h3><p>This is less a command and more a <strong>habit</strong>.</p><p>Suppose your final command is:</p><pre>grep -v &#39;^#&#39; results.tsv | awk &#39;$3==&quot;PASS&quot; {print $1,$2}&#39; | sort -k2,2nr | head</pre><p>Don’t write it all at once.</p><p>Build it.</p><p>Start:</p><pre>grep -v &#39;^#&#39; results.tsv</pre><p>Then:</p><pre>grep -v &#39;^#&#39; results.tsv | awk &#39;$3==&quot;PASS&quot;&#39;</pre><p>Then:</p><pre>grep -v &#39;^#&#39; results.tsv | awk &#39;$3==&quot;PASS&quot; {print $1,$2}&#39;</pre><p>Then:</p><pre>grep -v &#39;^#&#39; results.tsv | awk &#39;$3==&quot;PASS&quot; {print $1,$2}&#39; | sort -k2,2nr</pre><p>Finally:</p><pre>grep -v &#39;^#&#39; results.tsv | awk &#39;$3==&quot;PASS&quot; {print $1,$2}&#39; | sort -k2,2nr | head</pre><p>At each stage, inspect the output.</p><p>This makes debugging much easier.</p><p>A common beginner mistake is trying to construct a complicated one-liner immediately, getting an unexpected result, and then having no idea which part failed.</p><p><strong>Power users don’t necessarily write complicated commands from the beginning. They know how to decompose problems into simple commands and then compose them.</strong></p><h3>The Bigger Picture</h3><p>The techniques above are not isolated tricks.</p><p>They fit together.</p><p>Consider this command:</p><pre>grep &quot;ERROR&quot; application.log | sort | uniq -c | sort -nr | tee error_summary.txt</pre><p>You’ve just used:</p><ul><li>grep for searching</li><li>| for piping</li><li>sort for ordering</li><li>uniq -c for counting</li><li>sort -nr for numerical sorting</li><li>tee for displaying and saving output</li></ul><p>Or consider:</p><pre>nohup ./analysis.sh &gt; analysis.log 2&gt;&amp;1 &amp;</pre><p>This uses:</p><ul><li>background execution</li><li>output redirection</li><li>error redirection</li><li>nohup</li></ul><p>The individual pieces aren’t particularly complicated.</p><p>The important skill is knowing <strong>how they interact</strong>.</p><h3>A Useful Mental Model</h3><p>When working at the Linux command line, start thinking in terms of:</p><pre>INPUT<br>  ↓<br>SEARCH<br>  ↓<br>FILTER<br>  ↓<br>TRANSFORM<br>  ↓<br>SORT / COUNT<br>  ↓<br>SAVE</pre><p>For example:</p><pre>grep &quot;PASS&quot; results.tsv \<br>    | awk &#39;{print $1,$3}&#39; \<br>    | sort \<br>    | uniq -c \<br>    | tee summary.txt</pre><p>You don’t need one giant program to perform every operation.</p><p>You can build a workflow from small, predictable components.</p><p>That’s one of the fundamental strengths of the Unix/Linux command line</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7eaf2e3e7f3b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[10 Linux Commands Every Power User Should Know]]></title>
            <link>https://medium.com/@ishaaq.raja/10-linux-commands-every-power-user-should-know-dff885ad99d5?source=rss-bd02ebfbd1a8------2</link>
            <guid isPermaLink="false">https://medium.com/p/dff885ad99d5</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[trending]]></category>
            <category><![CDATA[linux-tutorial]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[linux]]></category>
            <dc:creator><![CDATA[Raja ishaq Nabi Khan]]></dc:creator>
            <pubDate>Sat, 05 Sep 2026 09:46:11 GMT</pubDate>
            <atom:updated>2026-09-05T09:46:11.448Z</atom:updated>
            <content:encoded><![CDATA[<h3>Most people use the Linux terminal like a remote control.</h3><p>They type a command, press Enter, and hope for the best.</p><p>Power users work differently.</p><p>They know how to find information quickly, monitor their system, inspect logs, manage processes, and combine simple commands into powerful workflows.</p><p>The good news? You don’t need to memorize hundreds of commands.</p><p>Here are <strong>10 Linux commands that can dramatically improve the way you work in the terminal</strong>.</p><h3>1. grep — Find What You Actually Need</h3><p>grep searches for specific text inside files.</p><p>Imagine you have a massive log file with thousands of lines. Instead of manually scrolling through it, you can search for exactly what you need.</p><pre>grep &quot;ERROR&quot; application.log</pre><p>This will display every line containing ERROR.</p><h3>Useful options</h3><p>Ignore uppercase and lowercase differences:</p><pre>grep -i &quot;error&quot; application.log</pre><p>Search recursively through directories:</p><pre>grep -r &quot;password&quot; .</pre><p>Show line numbers:</p><pre>grep -n &quot;ERROR&quot; application.log</pre><h3>Power-user example</h3><pre>grep -rni &quot;database connection failed&quot; /var/log/</pre><p>This searches recursively, ignores case differences, and shows line numbers.</p><p>Once you start working with logs and large codebases, grep becomes indispensable.</p><h3>2. find — Locate Files Like a Pro</h3><p>Can’t remember where a file is?</p><p>Use find.</p><p>Search for all Python files:</p><pre>find . -name &quot;*.py&quot;</pre><p>Search for a specific file:</p><pre>find /home -name &quot;config.json&quot;</pre><p>Find files larger than 1 GB:</p><pre>find / -type f -size +1G</pre><p>Find files modified in the last seven days:</p><pre>find . -mtime -7</pre><h3>Power-user example</h3><p>Find all .log files and delete them:</p><pre>find . -name &quot;*.log&quot; -delete</pre><p>⚠️ Be careful with destructive commands.</p><p>A safer approach is to first run:</p><pre>find . -name &quot;*.log&quot;</pre><p>Verify the results before adding -delete.</p><p>That simple habit can save you from deleting the wrong files.</p><h3>3. history — Stop Typing the Same Commands Again</h3><p>Your terminal remembers the commands you’ve previously executed.</p><p>View your command history:</p><pre>history</pre><p>Search for a previous command:</p><pre>history | grep docker</pre><p>Repeat the last command:</p><pre>!!</pre><p>Run a specific command from history:</p><pre>!245</pre><p>For example, if command number 245 was a long rsync command, you don&#39;t need to type it again.</p><h3>Power-user tip</h3><p>Use reverse search:</p><p>Press:</p><pre>Ctrl + R</pre><p>Then start typing part of a previous command.</p><p>This is one of the fastest ways to retrieve commands you’ve used before.</p><h3>4. curl — Your Terminal&#39;s Internet Browser</h3><p>curl allows you to interact with web servers directly from the terminal.</p><p>Check a website:</p><pre>curl https://example.com</pre><p>Download a file:</p><pre>curl -O https://example.com/file.zip</pre><p>Check HTTP headers:</p><pre>curl -I https://example.com</pre><p>Send a POST request:</p><pre>curl -X POST \<br>-H &quot;Content-Type: application/json&quot; \<br>-d &#39;{&quot;name&quot;:&quot;Raja&quot;}&#39; \<br>https://api.example.com/users</pre><h3>Why power users love curl</h3><p>You can:</p><ul><li>Test APIs</li><li>Download files</li><li>Debug web applications</li><li>Check HTTP headers</li><li>Automate web requests</li></ul><p>If you work with APIs, servers, or web applications, curl is essential.</p><h3>5. ssh — Control Remote Machines From Anywhere</h3><p>ssh allows you to securely connect to another computer.</p><pre>ssh username@server-ip</pre><p>For example:</p><pre>ssh user@192.168.1.100</pre><p>Once connected, you can manage the remote machine as if you were sitting in front of it.</p><h3>Connect using a specific key</h3><pre>ssh -i ~/.ssh/mykey.pem user@server-ip</pre><h3>Run a command remotely</h3><pre>ssh user@server-ip &quot;df -h&quot;</pre><p>This connects to the remote machine, runs df -h, and returns the output.</p><p>You don’t always need to manually log in to a server to perform a task.</p><h3>6. rsync — Copy Files Without Wasting Time</h3><p>rsync is one of the most useful tools for transferring and synchronizing files.</p><p>Copy a folder:</p><pre>rsync -av source/ destination/</pre><p>Copy files to a remote server:</p><pre>rsync -av project/ user@server:/home/user/project/</pre><p>The real advantage?</p><p>rsync transfers only the changed parts of files during subsequent runs.</p><p>That makes it extremely useful for:</p><ul><li>Backups</li><li>Server deployments</li><li>Large datasets</li><li>Synchronizing research data</li></ul><h3>Power-user example</h3><pre>rsync -avz --progress project/ user@server:/backup/project/</pre><p>Here:</p><ul><li>-a preserves file attributes</li><li>-v shows detailed output</li><li>-z compresses data during transfer</li><li>--progress shows transfer progress</li></ul><p>If you regularly move large files, learn rsync.</p><h3>7. tail — Watch Logs in Real Time</h3><p>When something goes wrong on a Linux server, the answer is often hiding inside a log file.</p><p>View the last 10 lines:</p><pre>tail application.log</pre><p>View the last 100 lines:</p><pre>tail -n 100 application.log</pre><p>Follow a log in real time:</p><pre>tail -f application.log</pre><p>This command is incredibly useful when monitoring applications.</p><h3>Example</h3><pre>tail -f /var/log/syslog</pre><p>Or for a web server:</p><pre>tail -f /var/log/nginx/access.log</pre><p>You can literally watch new log entries appear as they happen.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hXt9G9DT4Frqw2iwkclirg.png" /></figure><h3>8. df and du — Find Out Where Your Disk Space Went</h3><p>Your system says:</p><blockquote><em>Disk space: 100% full.</em></blockquote><p>Now what?</p><p>Start with:</p><pre>df -h</pre><p>This shows disk usage in a human-readable format.</p><p>Example:</p><pre>Filesystem      Size  Used Avail Use%<br>/dev/sda1       100G   92G   8G  92%</pre><p>But df only tells you which disk is full.</p><p>To find what is consuming the space, use:</p><pre>du -sh *</pre><p>Check the size of directories:</p><pre>du -sh /home/*</pre><p>Find the largest directories:</p><pre>du -sh * | sort -h</pre><p>This is one of the most useful troubleshooting workflows in Linux.</p><h3>9. ps and kill — Take Control of Processes</h3><p>Every program running on Linux is a process.</p><p>View running processes:</p><pre>ps aux</pre><p>Search for a specific process:</p><pre>ps aux | grep python</pre><p>You can also use:</p><pre>pgrep python</pre><p>If a process becomes unresponsive, you can terminate it.</p><pre>kill PID</pre><p>For example:</p><pre>kill 2458</pre><p>If the process refuses to stop:</p><pre>kill -9 2458</pre><p>⚠️ Use kill -9 carefully.</p><p>It forcefully terminates a process without allowing it to clean up resources.</p><p>A better approach is to try the normal kill command first.</p><h3>10. chmod — Control Who Can Do What</h3><p>Linux is built around permissions.</p><p>The chmod command changes file permissions.</p><p>Make a script executable:</p><pre>chmod +x script.sh</pre><p>Now you can run:</p><pre>./script.sh</pre><p>Set specific permissions:</p><pre>chmod 755 script.sh</pre><p>The numbers represent permissions for:</p><pre>Owner | Group | Others</pre><p>Where:</p><pre>4 = Read<br>2 = Write<br>1 = Execute</pre><p>So:</p><pre>7 = Read + Write + Execute<br>5 = Read + Execute</pre><p>Therefore:</p><pre>chmod 755 script.sh</pre><p>Means:</p><pre>Owner  → Read, Write, Execute<br>Group  → Read, Execute<br>Others → Read, Execute</pre><p>Understanding permissions is essential if you work with servers, scripts, or shared systems.</p><h3>The Real Power Is in Combining Commands</h3><p>The real magic of Linux isn’t just knowing individual commands.</p><p>It’s combining them.</p><p>For example:</p><pre>ps aux | grep python</pre><p>Or:</p><pre>du -sh * | sort -h</pre><p>Or:</p><pre>history | grep docker</pre><p>The pipe symbol:</p><pre>|</pre><p>takes the output of one command and sends it to another.</p><p>This allows you to build surprisingly powerful workflows from simple tools.</p><h3>Bonus: Learn man</h3><p>Whenever you forget how a command works:</p><pre>man command_name</pre><p>For example:</p><pre>man rsync</pre><p>This opens the official manual.</p><p>Want to know what options grep supports?</p><pre>man grep</pre><p>You don’t need to memorize everything.</p><p>Power users don’t necessarily remember every option.</p><p>They know <strong>how to find the information they need quickly</strong>.</p><h3>Final Thoughts</h3><p>You don’t become a Linux power user by memorizing 500 commands.</p><p>You become one by learning a handful of tools well enough to solve real problems.</p><p>Start with these:</p><ul><li>grep for searching</li><li>find for locating files</li><li>history for faster workflows</li><li>curl for web requests</li><li>ssh for remote systems</li><li>rsync for file synchronization</li><li>tail for logs</li><li>df and du for disk troubleshooting</li><li>ps and kill for process management</li><li>chmod for permissions</li></ul><p>Learn one command at a time.</p><p>Use it repeatedly.</p><p>Experiment with its options.</p><p>Eventually, the terminal stops feeling like a place where you type commands.</p><p>It becomes a place where you solve problems.</p><h3>Which Linux command do you use the most?</h3><p>Let me know in the comments.</p><p><strong>Follow for more practical Linux, Python, bioinformatics, and research computing tutorials.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dff885ad99d5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Slash Command Feature That Makes Antigravity 2.0 Feel Like a Personal Assistant]]></title>
            <link>https://medium.com/@ishaaq.raja/the-slash-command-feature-that-makes-antigravity-2-0-feel-like-a-personal-assistant-242912186a9c?source=rss-bd02ebfbd1a8------2</link>
            <guid isPermaLink="false">https://medium.com/p/242912186a9c</guid>
            <category><![CDATA[grill-me]]></category>
            <category><![CDATA[schedule]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[google-antigravity]]></category>
            <category><![CDATA[goals]]></category>
            <dc:creator><![CDATA[Raja ishaq Nabi Khan]]></dc:creator>
            <pubDate>Mon, 25 May 2026 11:57:15 GMT</pubDate>
            <atom:updated>2026-05-25T11:57:15.460Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Antigravity 2.0 introduces slash commands like </em><em>/goal, </em><em>/grill-me, </em><em>/schedule, and </em><em>/browser. They may look like simple shortcuts, but they reveal a bigger shift: AI tools are moving from passive chatbots to controllable digital coworkers.</em></p><p>Most people think the future of AI work will be defined by bigger models.</p><p>Better reasoning. Longer context. More automation.</p><p>All of that matters. But sometimes the most important changes appear in smaller interface details: a button, a workflow, or a command.</p><p>Instead of writing a long prompt and hoping the agent understands your intention, slash commands make the mode of work explicit. Do you want the agent to finish the task without interrupting you? Ask it with /goal. Do you want it to question you before starting? Use /grill-me. Do you want the work to happen later or repeatedly? Use /schedule. Do you want the agent to use the browser? Use /browser.</p><p>As AI systems become more agentic, we do not only need smarter AI. We need clearer ways to direct it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JLkHY29HL1Fc3EYVMMJJ6g.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PJn8ouJH1stTAwoNHal0PA.png" /></figure><h3>Why Slash Commands Matter</h3><p>Traditional chatbots work like conversations.</p><p>You ask a question. The AI answers.</p><p>That model is useful for brainstorming, writing, summarizing, and quick problem-solving. But agentic systems are different: they can take actions, use tools, inspect files, browse the web, run tasks, and continue working across multiple steps.</p><p>That creates a new challenge:</p><p>How do we control the agent’s behavior without writing a complicated instruction every time?</p><p>Slash commands are one answer. They act like work modes, telling the agent not only what to do, but how to approach the task.</p><p>For office workers, this is easy to understand. We already use different modes of collaboration every day.</p><p>Sometimes we tell a colleague, “Please handle this completely and send me the final version.” Other times we say, “Ask me questions first,” “Remind me every Friday,” or “Check the website and verify the details.”</p><p>Antigravity 2.0 turns those everyday patterns into explicit AI commands.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kDjIHrQnvuhZPalJXpVMEQ.png" /></figure><h3>/goal: Finish the Task, Do Not Stop Halfway</h3><p>The /goal command tells the agent to keep working until the task is complete.</p><p>That matters because normal prompting often stops too early. An assistant may give you a plan, ask for confirmation after each step, or summarize what it would do instead of producing the final result.</p><p>/goal changes the expectation from advice to completion.</p><p>Imagine you need to prepare a weekly status report for your manager.</p><p>You could write:</p><blockquote><em>/goal Create this week&#39;s project status report using the meeting notes, task updates, and pending action items. Organize it into completed work, current blockers, next steps, and decisions needed. Return only the final polished report.</em></blockquote><p>Use /goal when the task has a clear finish line, such as:</p><ul><li>finish a draft</li><li>clean up a document</li><li>summarize a long set of notes</li></ul><p>The key idea is completion. You are not asking for suggestions; you are delegating a task.</p><h3>/grill-me: Ask Questions Before Starting</h3><p>The /grill-me command tells the agent to pause and ask clarifying questions before it starts.</p><p>This is useful because many workplace tasks fail at the instruction stage. We assume context, forget deadlines, skip audience details, or leave out constraints that feel obvious to us. If the prompt is vague, an agent may confidently produce the wrong output.</p><p>/grill-me helps turn unclear intent into a sharper brief.</p><p>Imagine your manager asks you to prepare a presentation for an upcoming leadership meeting.</p><p>You could write:</p><blockquote><em>/grill-me I need to prepare a presentation for next week&#39;s leadership meeting about our team&#39;s quarterly performance. Ask me the important questions before creating the outline.</em></blockquote><p>The agent might ask:</p><ul><li>Who is the audience?</li><li>How long should the presentation be?</li><li>What decision should leadership make after seeing it?</li></ul><p>Use /grill-me when the task is important, ambiguous, or high-stakes, such as:</p><ul><li>presentations</li><li>emails to leadership</li><li>project plans</li></ul><p>The key idea is alignment. Before the agent acts, it helps you clarify what success looks like.</p><h3>/schedule: Make AI Work Part of the Calendar</h3><p>The /schedule command lets you run an instruction later or on a recurring schedule.</p><p>Most AI assistants are reactive: they wait for you to ask. /schedule makes the work more proactive by letting a recurring task happen at the right time without a fresh prompt every time.</p><p>Imagine you want a weekly reminder of open action items before your Monday team meeting.</p><p>You could write:</p><blockquote><em>/schedule Every Monday at 8:30 AM, summarize the open action items from last week&#39;s meeting notes and prepare a short list of what I should follow up on before the team meeting.</em></blockquote><p>This is useful for recurring office tasks such as:</p><ul><li>weekly reports</li><li>meeting preparation</li><li>follow-up reminders</li></ul><p>Use /schedule when the task is:</p><ul><li>recurring</li><li>time-sensitive</li><li>easy to forget</li></ul><p>The key idea is rhythm. The AI becomes part of your calendar, not just your chat window.</p><h3>/browser: Verify Information From the Web</h3><p>The /browser command tells the agent to use browser capabilities.</p><p>This matters because not every task can be answered from memory. Some work requires current information: pricing pages, event details, company announcements, product documentation, policy updates, or public deadlines.</p><p>With /browser, you are explicitly telling the agent to check instead of guess.</p><p>Imagine your team is preparing to renew a software subscription and you need current pricing before a budget discussion.</p><p>You could write:</p><blockquote><em>/browser Check the current pricing page for our project management software, compare the available plans, and summarize which plan best fits a 25-person team.</em></blockquote><p>Use /browser when the task requires:</p><ul><li>current pricing</li><li>public documentation</li><li>event details</li></ul><p>The key idea is verification. You are telling the AI not to guess; you are telling it to check.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Gg3AVV3MFPPudCiao583dw.png" /></figure><h3>Final Thoughts</h3><p>Google Antigravity 2.0’s slash commands may look like a small interface feature, but they point to a larger change in how we work with AI.</p><p>The next generation of AI tools will not only be judged by how much they know or how fast they respond. They will be judged by how clearly we can direct them.</p><p>That is what /goal, /grill-me, /schedule, and /browser make visible. Each command gives the agent a different working mode: finish the task, ask better questions, return at the right time, or verify information before answering.</p><p>For developers, this can make agentic software work easier to manage. For office workers, it makes AI feel less like a chatbot and more like a capable assistant that can be guided with precision.</p><p>The future of AI at work is not just about asking better questions. It is about giving better instructions to systems that can actually act on them.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=242912186a9c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Integrate OpenAI Codex into VS Code]]></title>
            <link>https://medium.com/@ishaaq.raja/how-to-integrate-openai-codex-into-vs-code-159c2353bdc5?source=rss-bd02ebfbd1a8------2</link>
            <guid isPermaLink="false">https://medium.com/p/159c2353bdc5</guid>
            <category><![CDATA[vscode-extension]]></category>
            <category><![CDATA[chatgpt]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[openai-codex]]></category>
            <dc:creator><![CDATA[Raja ishaq Nabi Khan]]></dc:creator>
            <pubDate>Wed, 20 May 2026 16:09:28 GMT</pubDate>
            <atom:updated>2026-05-23T12:49:43.824Z</atom:updated>
            <content:encoded><![CDATA[<h3><strong>How to Integrate OpenAI Codex into VS Code and Antigravity</strong></h3><p>OpenAI Codex can now be integrated directly into <strong>Visual Studio Code</strong> and <strong>Antigravity</strong>, allowing developers to generate, edit, debug, and refactor code without leaving the editor. The integration works through the official Codex extension and supports both ChatGPT login and API-based authentication.</p><h3>Step 1: Open VS Code Extensions</h3><p>In VS Code:</p><ul><li>Press Ctrl + Shift + X</li><li>Open the Extensions Marketplace</li></ul><h3>Step 2: Search for Codex</h3><p>Search for:</p><pre>OpenAI Codex</pre><p>Install the official Codex extension from OpenAI.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TIdEmma6LRl3FYJdA76Q7g.png" /></figure><h3>Step 3: Sign In</h3><p>After installation, the extension provides multiple authentication methods:</p><h3><strong>Sign in with ChatGPT</strong></h3><h3><strong>Use API Key</strong></h3><h3><strong>Use device code</strong></h3><h3>Option 1: Sign in with ChatGPT</h3><ul><li>Click <strong>Sign in with ChatGPT</strong></li><li>A browser window will open and redirect you to the ChatGPT web portal</li><li>Log in using your OpenAI account credentials</li><li>Once authenticated, VS Code will automatically connect to your account</li></ul><h3>Option 2: Use an OpenAI API Key</h3><p>If you prefer API-based authentication, you can connect Codex to VS Code using an OpenAI API key.</p><p>Go to <a href="https://platform.openai.com/">https://platform.openai.com/</a></p><p>1. Click <strong>Create new secret key</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kFgr82WwNrUD5yGSTjnEGQ.png" /></figure><p>After clicking “Create new secret key”, you will see the following configuration window:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/998/1*S9JMnDsyHMGyewSuMpOUDg.png" /></figure><p>2. Keep the following settings:</p><ul><li><strong>Owned by → You</strong></li><li><strong>Project → Default project</strong></li></ul><p>3. Enter a name for the key, for example:</p><pre>VSCode-Key</pre><p>4. Under Permissions:</p><ul><li>Select <strong>All</strong> for standard usage</li></ul><p>5. Click:</p><pre>Create secret key</pre><p>After the key is generated:</p><ul><li>Copy the API key immediately</li><li>OpenAI will not display it again</li></ul><p>The generated key will look similar to:</p><pre>sk-proj-xxxxxxxxxxxxxxxx</pre><h4>6. Connect the API Key to VS Code</h4><p>After generating the API key, open VS Code and launch the Codex extension.</p><p>When prompted, paste the generated API key into the authentication window.</p><p>Once the key is verified, Codex will connect to your OpenAI account and become available directly inside VS Code.</p><h3>Option 3: Use Device Code Authentication</h3><p>Some setups may also provide <strong>Device Code Authentication</strong>.</p><p>In this method:</p><ul><li>VS Code displays a temporary device code</li><li>You enter the code on the OpenAI authentication webpage</li><li>After verification, VS Code connects automatically</li></ul><p>This is useful when browser-based login is restricted.</p><h3>Step 5: Start Using Codex</h3><p>Once connected, Codex becomes available directly inside VS Code and can assist with:</p><ul><li>Code generation</li><li>Debugging</li><li>Refactoring</li><li>Documentation</li><li>Multi-file editing</li><li>Terminal assistance</li></ul><p>Suggestions appear inline while coding, making development faster and more interactive.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=159c2353bdc5" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>