Bash File Searching: Exercises, Solutions, and Explanations
1.
Write a Bash script that searches for a file named "output.txt" in the current directory.
Code:
Output:
File 'output.txt' found in the current directory.
Explanation:
In the exercise above,
- if [ -f "output.txt" ]; then: This line checks if a file named "output.txt" exists in the current directory.
- [ -f "output.txt" ] is a conditional expression that tests if "output.txt" exists and is a regular file.
- If the file exists, the condition returns true, and the code inside the "if" block is executed.
- echo "File 'output.txt' found in the current directory.": If the file "output.txt" exists in the current directory, this line prints a message indicating that the file is found.
- else: If the condition in the "if" statement evaluates to false, meaning "output.txt" does not exist or is not a regular file, the code inside the "else" block is executed.
- echo "File 'output.txt' not found in the current directory.": In the "else" block, this line prints a message indicating that the file "output.txt" is not found in the current directory.
- fi: This marks the end of the "if" statement.
2.
Write a Bash script that searches for a file with a specific name provided as an argument to the script.
Code:
Output:
ad@DESKTOP-3KE0KU4:~$ ./test1.sh input.txt File 'input.txt' found in the current directory. ad@DESKTOP-3KE0KU4:~$ ./test1.sh document.doc File 'document.doc' not found in the current directory.
Explanation:
In the exercise above,
- if [ $# -ne 1 ]; then: Checks if the number of arguments provided is not equal to 1.
- echo "Usage: $0 <filename>": Prints a usage message if the number of arguments is incorrect.
- exit 1: Exits the script with a non-zero status code to indicate an error.
- filename="$1": Assigns the first argument provided to the variable 'filename'.
- if [ -f "$filename" ]; then: Checks if the file with the provided filename exists in the current directory.
- echo "File '$filename' found in the current directory.": Prints a message if the file is found.
- echo "File '$filename' not found in the current directory.": Prints a message if the file is not found.
3.
Write a Bash script that searches for files modified within the last 3 days in the current directory.
Code:
Output:
abc.sh erorrrr.log input1.txt input.txt old_error.log test1.sh test.sh
Explanation:
In the exercise above,
- current_time=$(date +%s): Gets the current time in seconds since the epoch.
- three_days_ago=$((current_time - (3 24 60 * 60))): Calculates the time 3 days ago in seconds since the epoch.
- for file in *; do: Iterates over each file in the current directory.
- if [ -f "$file" ] && [ $(stat -c %Y "$file") -ge "$three_days_ago" ]; then: Checks if the file is a regular file (-f) and if its modification time (obtained using stat -c %Y "$file") is greater than or equal to the time 3 days ago.
- echo "$file": Prints the filename if it meets the criteria.
4.
Write a Bash script that searches for files larger than 1KB in the current directory.
Code:
Output:
output.txt
Explanation:
In the exercise above,
- for file in *; do: Iterates over each file in the current directory.
- if [ -f "$file" ] && [ $(stat -c %s "$file") -gt 1024 ]; then: Checks if the file is a regular file (-f) and if its size in bytes (obtained using stat -c %s "$file") is greater than 1024 bytes (1KB).
- echo "$file": Prints the filename if it meets the criteria.
5.
Write a Bash script that searches for empty files in the current directory.
Code:
Output:
input1.txt input.txt
Explanation:
In the exercise above,
- for file in *; do: Iterates over each file in the current directory.
- if [ -f "$file" ] && [ ! -s "$file" ]; then: Checks if the file is a regular file (-f) and if its size (obtained using ! -s "$file") is 0, indicating it's empty.
- echo "$file": Prints the filename if it meets the criteria.
6.
Write a Bash script that searches for files with a specific extension (e.g., "txt") in the current directory.
Code:
Output:
input1.txt input.txt
Explanation:
In the exercise above,
- extension="txt": Specifies the extension to search for.
- for file in *; do: Iterates over each file in the current directory.
- ${file##*.}: Extracts the file extension.
- if [ "${file##*.}" = "$extension" ]; then: Checks if the extracted extension matches the specified extension.
- echo "$file": Prints the filename if it has the specified extension.
7.
Write a Bash script that searches for files containing a specific string provided as an argument to the script.
Code:
Output:
ad@DESKTOP-3KE0KU4:~$ ./test1.sh shell file2.txt output.txt sample.txt
Explanation:
In the exercise above,
- $# -eq 0: Checks if no command-line arguments are provided.
- echo "Usage: $0 <search_string>": Prints usage instructions if no argument is provided.
- search_string="$1": Extracts the search string from the command-line argument.
- for file in *; do: Iterates over each file in the current directory.
- if [ -f "$file" ] && [ $(grep -q "$search_string" "$file"; echo $?) -eq 0 ]; then: Checks if the file is a regular file and contains the search string using grep.
- echo "$file": Prints the filename if it contains the search string.
8.
Write a Bash script that searches for files owned by a specific user in the current directory.
Code:
Output:
ad@DESKTOP-3KE0KU4:~$ ./test1.sh ad ./.bash_history ./.bash_logout ./.bashrc ./.profile ./.viminfo ./abc.sh ./document.txt ./erorrrr.log ./file2.txt ./input.txt ./input1.txt ./nums.txt ./old_error.log ./output.txt ./sample.txt ./test.sh ./test1.sh ad@DESKTOP-3KE0KU4:~$ ./test1.sh us find: 'us' is not the name of a known user
Explanation:
In the exercise above,
- $# -eq 0: Checks if no command-line arguments are provided.
- echo "Usage: $0 <username>": Prints usage instructions if no argument is provided.
- username="$1": Extracts the username from the command-line argument.
- find . -maxdepth 1 -type f -user "$username": Searches for files (-type f) owned by the specified user (-user "$username") in the current directory (.) without descending into subdirectories (-maxdepth 1).
9.
Write a Bash script that searches for symbolic links in the current directory.
Code:
Output:
./my_link
Explanation:
In the exercise above,
- find .: Start searching from the current directory.
- -maxdepth 1: Limits the search to the current directory without descending into subdirectories.
- -type l: Specifies that only symbolic links should be considered.
10.
Write a Bash script that searches for files with execute permissions in the current directory.
Code:
Output:
./test.sh ./test1.sh
Explanation:
In the exercise above,
- find .: Start searching from the current directory.
- -maxdepth 1: Limits the search to the current directory without descending into subdirectories.
- -type f: Specifies that only regular files should be considered (not directories or other types of files).
- -executable: Filters the search to include only files with execute permissions.
Bash Editor:
More to Come !
Do not submit any solution of the above exercises at here, if you want to contribute go to the appropriate exercise page.
- Weekly Trends and Language Statistics
- Weekly Trends and Language Statistics