📅  最后修改于: 2023-12-03 15:13:36.707000             🧑  作者: Mango
foreach
Directory Loop - Shell-BashBash provides a foreach
loop to iterate over directories and perform various actions on each directory or its contents. In this guide, we will explore how to use the foreach
loop in the Bash shell script to programmatically process multiple directories.
The basic syntax of the foreach
loop in Bash is as follows:
for dir in /path/to/dir/*; do
# Statements to execute for each directory
echo "Processing ${dir}"
# ...
done
In this syntax, /path/to/dir/*
represents the source directory or pattern to match directories. You can specify a specific directory path or use wildcards to match multiple directories.
Let's take a simple example to count the number of files in each directory using the foreach
loop. Consider the following script:
#!/bin/bash
for dir in /path/to/dir/*; do
if [ -d "${dir}" ]; then
file_count=$(ls -l "${dir}" | grep -v "^d" | wc -l)
echo "Directory ${dir} contains ${file_count} files."
fi
done
Explanation:
if [ -d "${dir}" ]
condition checks if the iteration value ($dir
) is a directory.ls -l "${dir}"
lists the files and directories within "${dir}".grep -v "^d"
filters out the lines that start with 'd' (directories).wc -l
counts the number of lines (files).echo
statement prints the directory path and the number of files it contains.Make sure to replace /path/to/dir/*
with the actual directory path or pattern you want to process.
Let's explore another example to rename all the files within multiple directories using the foreach
loop. Here's an example script:
#!/bin/bash
for dir in /path/to/dir/*; do
if [ -d "${dir}" ]; then
for file in "${dir}"/*; do
if [ -f "${file}" ]; then
new_name="${file}.bak"
mv "${file}" "${new_name}"
echo "Renamed ${file} to ${new_name}."
fi
done
fi
done
Explanation:
if [ -d "${dir}" ]
checks if the iteration value ($dir
) is a directory.for file in "${dir}"/*
loop iterates over each file within the current directory.if [ -f "${file}" ]
condition verifies if the iteration value ($file
) is a regular file.new_name="${file}.bak"
line creates a new name for the file by appending .bak
extension.mv "${file}" "${new_name}"
renames the file.echo
statement prints the original file name and the new renamed file.Again, replace /path/to/dir/*
with the actual directory path.
The Bash foreach
directory loop provides a flexible and powerful way to process multiple directories and their contents. You can modify the loop statements to perform various tasks specific to your requirements. Remember to use proper error handling and ensure the correct paths are provided to avoid unintended consequences.