1

My program is suppose to print out files that are readable and writable, print out the amount of files (that are readable and writable), print out the total amount of files and finally list all files in the current directory in long list format (sorted by modification time (newest first)). But I've run into some problems and I cant figure out what is missing/what is wrong in my code.

#!/bin/bash
RWFILE= 0
ALL= 0
FILE= `ls`
for f in $FILE
do
if[[ -r $FILE && -w $FILE ]]
then
    RWFILE= RWFILE + 1
    echo possible readable & writable files: $FILE
fi
ALL= ALL +1
echo Number of possible readable and writable files in current directory: $RWFILE
echo Number of files in current directory $ALL
echo list of files in this directory by modification time: ls -l
done

whenever I run the program I get a couple of errors,

  1. line 3: 0: command not found

  2. line 4: 0: command not found

  3. line 11: syntax error near unexpected token 'then'

  4. line 11: 'then'

Could anyone tell me what is wrong?

1
  • 2
    When assigning variables, always remove the spaces around the equation symbol: e.g. RWFILE=0
    – Byte Commander
    Nov 23, 2015 at 16:36

2 Answers 2

1

There are several problems in the script. I think so amended should work ..

#!/bin/bash
RWFILE="0"
ALL="0"
for f in *
do
if [[ -r $f && -w $f ]] ;
then
    RWFILE=$((RWFILE+1))
    echo "possible readable & writable files: $RWFILE"
fi
ALL=$((ALL+1))
echo "Number of possible readable and writable files in current directory: $RWFILE"
echo "Number of files in current directory $ALL"
echo "list of files in this directory by modification time: ls -l"
done
2
  • you should use ls -lt to sort the files by modification time. ls -l sorts by name.
    – Wayne_Yux
    Nov 23, 2015 at 16:47
  • It would be a good idea to describe what you have amended, so it is possible for people to learn what to do :)
    – Wilf
    Nov 23, 2015 at 18:58
1

The solution by @LilloX should work, but I would recommend using find for the job:

find . -maxdepth 1 -perm 644 | wc -l

This returns the number of files with read and write permissions for the owner of the file in the current directory. If you remove | wc -l from the command, it returns the files themselves.
See man find for more information on how to use find.


Edit:

This is an excerpt from man find. As you can see, there are many possibilities to define the permissions in the search. If you want to match files that are read- and writeable by anyone and also include files that have additional permissions (executeable), you can use find -perm /u+w,g+w,a+w

 find . -perm 664

    Search for files which have read and write permission for their owner, and group, but which other users can read but not  write  to.   Files  which
    meet these criteria but have other permissions bits set (for example if someone can execute the file) will not be matched.

    find . -perm -664

    Search  for files which have read and write permission for their owner and group, and which other users can read, without regard to the presence of
    any extra permission bits (for example the executable bit).  This will match a file which has mode 0777, for example.

    find . -perm /222

    Search for files which are writable by somebody (their owner, or their group, or anybody else).    

    find . -perm /220
    find . -perm /u+w,g+w
    find . -perm /u=w,g=w

    All three of these commands do the same thing, but the first one uses the octal representation of the file mode, and the other two use the symbolic
    form. These  commands  all search for files which are writable by either their owner or their group.  The files don't have to be writable by both
    the owner and group to be matched; either will do.

    find . -perm -220
    find . -perm -g+w,u+w

    Both these commands do the same thing; search for files which are writable by both their owner and their group.

    find . -perm -444 -perm /222 ! -perm /111
    find . -perm -a+r -perm /a+w ! -perm /a+x

    These two commands both search for files that are readable for everybody ( -perm -444 or -perm -a+r), have at least one write bit set ( -perm  /222
    or -perm /a+w) but are not executable for anybody ( ! -perm /111 and ! -perm /a+x respectively).
0

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .