Home > Software design >  For loop, wildcard and conditional statement
For loop, wildcard and conditional statement

Time:11-14

I don't really know what am I supposed to do with it.

For each file in the /etc directory whose name starts with the o or l and the second letter and the second letter of the name is t or r, display its name, size and type ('file'/'directory'/'link'). Use: wildcard, for loop and conditional statement for the type.

#!/bin/bash
etc_dir=$(ls -a /etc/ | grep '^o|^l|^.t|^.r')
for file in $etc_dir
do
    stat -c '%s-%n' "$file"
done

I was thinking about something like that but I have to use if statement.

CodePudding user response:

You may reach the goal by using find command.

This will search through all subdirectories.
#!/bin/bash
_dir='/etc'

find "${_dir}" -name "[ol][tr]*" -exec stat -c '%s-%n' {} \; 2>/dev/null
To have control on searching in subdirectories, you may use -maxdepth flag, like in the below example it will search only the files and directories name in the /etc dir and don't go through the subdirectories.
#!/bin/bash
_dir='/etc'

find "${_dir}" -maxdepth 1 -name "[ol][tr]*" -exec stat -c '%s-%n' {} \; 2>/dev/null
You may also use -type f OR -type d parameters to filter finding only Files OR Directories accordingly (if needed).
#!/bin/bash
_dir='/etc'

find "${_dir}" -name "[ol][tr]*" -type f -exec stat -c '%s-%n' {} \; 2>/dev/null

Update #1

Due to your request in the comments, this is a long way but used for loop and if statement.

Note: I'd strongly recommend to review and practice the commands used in this script instead of just copy and pasting them to get the score ;)

#!/bin/bash
# Set the main directory path.
_mainDir='/etc'

# This will find all files in the $_mainDir (ignoring errors if any) and assign the file's path to the $_files variable.
_files=$(find "${_mainDir}" 2>/dev/null)

# In this for loop we will 
# loop over all files
# identify the poor filename from the whole file path
# and IF the poor file name matches the statement then run & output the `stat` command on that file.

for _file in ${_files} ;do
  _fileName=$(basename ${_file})
  if [[ "${_fileName}" =~  ^[ol][tr].* ]] ;then
    stat -c 'Size: %s , Type: %n ' "${_file}"
  fi
done

exit 0

CodePudding user response:

You should break-down you problems into multiple pieces and tackle them one by one.

First, try and build an expression that finds the right files. If you were to execute your regex expression in a shell:

ls -a /etc/ | grep '^o|^l|^.t|^.r'

You would immediately see that you don't get the right output. So the first step would be to understand how grep works and fix the expression to:

ls -a /etc/ | grep '^[ol][tr]*'

Then, you have the file name, and you need the size and a textual file type. The size is easy to obtain using a stat call.

But, you soon realize you cannot ask stat to provide a textual format of the file type with the -f switch, so you probably have to use an if clause to present that.

  • Related