# Bash - Add Symbolic Links Subdirectories

To efficiently add these symbolic links to all subdirectories that are missing them, you can use a `find` loop. This command will check each subdirectory and only create the link if a file or link named `.env` or `.secret` doesn't already exist.

### The Command

Run this from the parent directory where your subdirectories are located:

<div _ngcontent-ng-c2439404967="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel tutor-markdown-rendering stronger enable-updated-hr-color" dir="ltr" id="bkmrk-" inline-copy-host=""></div><div _ngcontent-ng-c1827915975="" class="code-block ng-tns-c1827915975-154 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwjEsPHtoeaTAxUAAAAAHQAAAAAQ7AI" decode-data-ved="1" id="bkmrk-bash" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_bf97112877a44657","c_ecf4d754baab94b9",null,"rc_2de37ea6abea6508",null,null,"en",null,1,null,null,1,0]]"><div _ngcontent-ng-c1827915975="" class="code-block-decoration header-formatted gds-title-s ng-tns-c1827915975-154 ng-star-inserted"><span class="ng-tns-c1827915975-154">Bash</span><div _ngcontent-ng-c1827915975="" class="buttons ng-tns-c1827915975-154 ng-star-inserted"><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c1827915975-154 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c1827915975="" class="formatted-code-block-internal-container ng-tns-c1827915975-154"><div _ngcontent-ng-c1827915975="" class="animated-opacity ng-tns-c1827915975-154"></div></div></div>```
find . -maxdepth 1 -type d ! -path . -exec sh -c '
    cd "$1"
    [ ! -e .env ] && ln -s /mnt/volume1/docker/shared.env .env
    [ ! -e .secret ] && ln -s /mnt/volume1/docker/secret.env .secret
' _ {} \;

```

<div _ngcontent-ng-c1827915975="" class="code-block ng-tns-c1827915975-154 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwjEsPHtoeaTAxUAAAAAHQAAAAAQ7AI" decode-data-ved="1" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_bf97112877a44657","c_ecf4d754baab94b9",null,"rc_2de37ea6abea6508",null,null,"en",null,1,null,null,1,0]]"><div _ngcontent-ng-c1827915975="" class="formatted-code-block-internal-container ng-tns-c1827915975-154"><div _ngcontent-ng-c1827915975="" class="animated-opacity ng-tns-c1827915975-154"></div></div></div><div _ngcontent-ng-c2439404967="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel tutor-markdown-rendering stronger enable-updated-hr-color" dir="ltr" id="bkmrk--2" inline-copy-host="">---

</div>### Breakdown of the Logic

<div _ngcontent-ng-c2439404967="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel tutor-markdown-rendering stronger enable-updated-hr-color" dir="ltr" id="bkmrk-find-.--maxdepth-1---1" inline-copy-host="">- **`find . -maxdepth 1 -type d ! -path .`**: This finds all directories exactly one level down from your current location, excluding the current directory (`.`) itself.
- **`-exec sh -c '...' _ {} \;`**: This executes a small shell script for every directory found.
- **`[ ! -e .env ]`**: This is a "logical gate." It checks if the file `.env` **does not** exist. If it's missing, it proceeds to the `&&` command to create the link.
- **`ln -s [target] [link_name]`**: Creates the symbolic link.

---

</div>### A Safer Alternative (Dry Run)

If you want to see which directories will be affected before actually making changes, you can use this "echo" version:

<div _ngcontent-ng-c2439404967="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel tutor-markdown-rendering stronger enable-updated-hr-color" dir="ltr" id="bkmrk--3" inline-copy-host=""></div><div _ngcontent-ng-c1827915975="" class="code-block ng-tns-c1827915975-155 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwjEsPHtoeaTAxUAAAAAHQAAAAAQ7QI" decode-data-ved="1" id="bkmrk-bash-1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_bf97112877a44657","c_ecf4d754baab94b9",null,"rc_2de37ea6abea6508",null,null,"en",null,1,null,null,1,0]]"><div _ngcontent-ng-c1827915975="" class="code-block-decoration header-formatted gds-title-s ng-tns-c1827915975-155 ng-star-inserted"><span class="ng-tns-c1827915975-155">Bash</span><div _ngcontent-ng-c1827915975="" class="buttons ng-tns-c1827915975-155 ng-star-inserted"><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c1827915975-155 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c1827915975="" class="formatted-code-block-internal-container ng-tns-c1827915975-155"><div _ngcontent-ng-c1827915975="" class="animated-opacity ng-tns-c1827915975-155"></div></div></div>```
find . -maxdepth 1 -type d ! -path . -exec sh -c '
    cd "$1"
    [ ! -e .env ] && echo "Linking .env in $1"
    [ ! -e .secret ] && echo "Linking .secret in $1"
' _ {} \;

```

<div _ngcontent-ng-c1827915975="" class="code-block ng-tns-c1827915975-155 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwjEsPHtoeaTAxUAAAAAHQAAAAAQ7QI" decode-data-ved="1" id="bkmrk--4" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_bf97112877a44657","c_ecf4d754baab94b9",null,"rc_2de37ea6abea6508",null,null,"en",null,1,null,null,1,0]]"><div _ngcontent-ng-c1827915975="" class="formatted-code-block-internal-container ng-tns-c1827915975-155"><div _ngcontent-ng-c1827915975="" class="animated-opacity ng-tns-c1827915975-155"></div></div></div><div _ngcontent-ng-c2439404967="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel tutor-markdown-rendering stronger enable-updated-hr-color" dir="ltr" id="bkmrk--5" inline-copy-host=""></div>### Quick Note on Relative vs. Absolute Paths

Since you are using **absolute paths** for your targets (`/mnt/volume1/...`), these links will work regardless of which subdirectory they live in. If you ever move the `docker` folder, you'll need to update the links, but for a fixed mount point like yours, this is the most reliable method.

## Add Folder Exceptions

<div _ngcontent-ng-c2439404967="" aria-busy="false" aria-live="off" class="markdown markdown-main-panel tutor-markdown-rendering stronger enable-updated-hr-color" dir="ltr" id="bkmrk--6" inline-copy-host=""></div>To exclude specific subdirectories, you can use the `! -name` flag (for simple folder names) or `-prune` (for more complex paths).

Here are the two best ways to do it, depending on how many folders you need to skip.

### Option 1: Excluding by Folder Name (Simple)

If you just want to skip a few specific folders by name (e.g., `backup` and `logs`), use this version. The `! -name "..."` flags tell `find` to ignore those specific directories.

<div _ngcontent-ng-c2439404967="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel tutor-markdown-rendering stronger enable-updated-hr-color" dir="ltr" id="bkmrk--7" inline-copy-host=""></div><div _ngcontent-ng-c1827915975="" class="code-block ng-tns-c1827915975-165 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwjEsPHtoeaTAxUAAAAAHQAAAAAQ_gI" decode-data-ved="1" id="bkmrk-bash-2" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_5f7e7cdca3de199a","c_ecf4d754baab94b9",null,"rc_9a3d4bed3870c2c7",null,null,"en",null,1,null,null,1,0]]"><div _ngcontent-ng-c1827915975="" class="code-block-decoration header-formatted gds-title-s ng-tns-c1827915975-165 ng-star-inserted"><span class="ng-tns-c1827915975-165">Bash</span><div _ngcontent-ng-c1827915975="" class="buttons ng-tns-c1827915975-165 ng-star-inserted"><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c1827915975-165 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c1827915975="" class="formatted-code-block-internal-container ng-tns-c1827915975-165"><div _ngcontent-ng-c1827915975="" class="animated-opacity ng-tns-c1827915975-165"></div></div></div>```
find . -maxdepth 1 -type d ! -path . ! -name "backup" ! -name "logs" -exec sh -c '
    cd "$1"
    [ ! -e .env ] && ln -s /mnt/volume1/docker/shared.env .env
    [ ! -e .secret ] && ln -s /mnt/volume1/docker/secret.env .secret
' _ {} \;

```

<div _ngcontent-ng-c1827915975="" class="code-block ng-tns-c1827915975-165 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwjEsPHtoeaTAxUAAAAAHQAAAAAQ_gI" decode-data-ved="1" id="bkmrk--8" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_5f7e7cdca3de199a","c_ecf4d754baab94b9",null,"rc_9a3d4bed3870c2c7",null,null,"en",null,1,null,null,1,0]]"><div _ngcontent-ng-c1827915975="" class="formatted-code-block-internal-container ng-tns-c1827915975-165"><div _ngcontent-ng-c1827915975="" class="animated-opacity ng-tns-c1827915975-165"></div></div></div><div _ngcontent-ng-c2439404967="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel tutor-markdown-rendering stronger enable-updated-hr-color" dir="ltr" id="bkmrk--9" inline-copy-host="">---

</div>### Option 2: Excluding a List (Cleanest for many folders)

If you have a long list of exceptions, you can use a **regex** pattern. This is much easier to read and maintain. Replace `folder1|folder2|folder3` with the names of the directories you want to skip.

<div _ngcontent-ng-c2439404967="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel tutor-markdown-rendering stronger enable-updated-hr-color" dir="ltr" id="bkmrk--10" inline-copy-host=""></div><div _ngcontent-ng-c1827915975="" class="code-block ng-tns-c1827915975-166 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwjEsPHtoeaTAxUAAAAAHQAAAAAQ_wI" decode-data-ved="1" id="bkmrk-bash-3" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_5f7e7cdca3de199a","c_ecf4d754baab94b9",null,"rc_9a3d4bed3870c2c7",null,null,"en",null,1,null,null,1,0]]"><div _ngcontent-ng-c1827915975="" class="code-block-decoration header-formatted gds-title-s ng-tns-c1827915975-166 ng-star-inserted"><span class="ng-tns-c1827915975-166">Bash</span><div _ngcontent-ng-c1827915975="" class="buttons ng-tns-c1827915975-166 ng-star-inserted"><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c1827915975-166 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c1827915975="" class="formatted-code-block-internal-container ng-tns-c1827915975-166"><div _ngcontent-ng-c1827915975="" class="animated-opacity ng-tns-c1827915975-166"></div></div></div>```
find . -maxdepth 1 -type d ! -path . -not -regextext ".*(folder1|folder2|folder3)$" -exec sh -c '
    cd "$1"
    [ ! -e .env ] && ln -s /mnt/volume1/docker/shared.env .env
    [ ! -e .secret ] && ln -s /mnt/volume1/docker/secret.env .secret
' _ {} \;

```

<div _ngcontent-ng-c1827915975="" class="code-block ng-tns-c1827915975-166 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwjEsPHtoeaTAxUAAAAAHQAAAAAQ_wI" decode-data-ved="1" id="bkmrk--11" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_5f7e7cdca3de199a","c_ecf4d754baab94b9",null,"rc_9a3d4bed3870c2c7",null,null,"en",null,1,null,null,1,0]]"><div _ngcontent-ng-c1827915975="" class="formatted-code-block-internal-container ng-tns-c1827915975-166"><div _ngcontent-ng-c1827915975="" class="animated-opacity ng-tns-c1827915975-166"></div></div></div><div _ngcontent-ng-c2439404967="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel tutor-markdown-rendering stronger enable-updated-hr-color" dir="ltr" id="bkmrk--12" inline-copy-host="">---

</div>### Pro-Tip: The "Dry Run"

I highly recommend running a "Dry Run" first to verify your exceptions are working correctly. This will print the folders it **would** have acted on without actually creating any links:

<div _ngcontent-ng-c2439404967="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel tutor-markdown-rendering stronger enable-updated-hr-color" dir="ltr" id="bkmrk--13" inline-copy-host=""></div><div _ngcontent-ng-c1827915975="" class="code-block ng-tns-c1827915975-167 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwjEsPHtoeaTAxUAAAAAHQAAAAAQgAM" decode-data-ved="1" id="bkmrk-bash-4" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_5f7e7cdca3de199a","c_ecf4d754baab94b9",null,"rc_9a3d4bed3870c2c7",null,null,"en",null,1,null,null,1,0]]"><div _ngcontent-ng-c1827915975="" class="code-block-decoration header-formatted gds-title-s ng-tns-c1827915975-167 ng-star-inserted"><span class="ng-tns-c1827915975-167">Bash</span><div _ngcontent-ng-c1827915975="" class="buttons ng-tns-c1827915975-167 ng-star-inserted"><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c1827915975-167 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c1827915975="" class="formatted-code-block-internal-container ng-tns-c1827915975-167"><div _ngcontent-ng-c1827915975="" class="animated-opacity ng-tns-c1827915975-167"></div></div></div>```
find . -maxdepth 1 -type d ! -path . ! -name "exclude_me" -exec echo "Processing: {}" \;

```

<div _ngcontent-ng-c1827915975="" class="code-block ng-tns-c1827915975-167 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwjEsPHtoeaTAxUAAAAAHQAAAAAQgAM" decode-data-ved="1" id="bkmrk--14" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_5f7e7cdca3de199a","c_ecf4d754baab94b9",null,"rc_9a3d4bed3870c2c7",null,null,"en",null,1,null,null,1,0]]"><div _ngcontent-ng-c1827915975="" class="formatted-code-block-internal-container ng-tns-c1827915975-167"><div _ngcontent-ng-c1827915975="" class="animated-opacity ng-tns-c1827915975-167"></div></div></div><div _ngcontent-ng-c2439404967="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel tutor-markdown-rendering stronger enable-updated-hr-color" dir="ltr" id="bkmrk--15" inline-copy-host=""></div>### Key Flags Used

<div _ngcontent-ng-c2439404967="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel tutor-markdown-rendering stronger enable-updated-hr-color" dir="ltr" id="bkmrk-%21--name-%22folder%22%3A-te" inline-copy-host="">- **`! -name "folder"`**: Tells find: "Do NOT include items with this name."
- **`! -path .`**: Prevents the command from trying to create links in the current parent directory (which would fail anyway since `.env` likely already exists there).
- **`-maxdepth 1`**: Ensures the command only looks at the folders right in front of you, rather than digging into sub-sub-directories.

</div>