Difference between revisions of "Tutorial3: Advanced File Management / Quoting Special Characters"

From CDOT Wiki
Jump to: navigation, search
(Filename Expansion)
(Filename Expansion)
Line 153: Line 153:
 
But this method is '''inefficient''': it requires a LOT of typing and knowing which filenames to include as separate arguments.<br>You can use a special character to indicate to the Bash shell to match all files that end with the extension ".txt":
 
But this method is '''inefficient''': it requires a LOT of typing and knowing which filenames to include as separate arguments.<br>You can use a special character to indicate to the Bash shell to match all files that end with the extension ".txt":
  
 
+
[[Image:globbing-demo.png|thumb|right|400px|'''Globbing''' is the process of expanding filenames as separate arguments that match an argument that uses a '''wildcard symbol''' (such as '''*''').]]
 
<span style="font-family:courier;>'''ls *.txt'''<br>
 
<span style="font-family:courier;>'''ls *.txt'''<br>
 
a.txt b.txt c.txt 1.txt 2.txt 3.txt abc.txt work.txt</span>
 
a.txt b.txt c.txt 1.txt 2.txt 3.txt abc.txt work.txt</span>
Line 163: Line 163:
 
''How Does this Work? (Process of Globbing)''
 
''How Does this Work? (Process of Globbing)''
  
[[Image:globbing-demo.png|thumb|right|400px|'''Globbing''' is the process of expanding filenames as separate arguments that match an argument that uses a '''wildcard symbol''' (such as '''*''').]]
+
 
 
'''File globbing''' is a feature provided by the UNIX/Linux shell to represent multiple filenames by using special characters called wildcards with a single file name. A wildcard is essentially a symbol which may be used to substitute for one or more characters. Therefore, we can use wildcards for generating the appropriate combination of file names as per our requirement.<br>Reference: https://www.linuxnix.com/10-file-globbing-examples-linux-unix/
 
'''File globbing''' is a feature provided by the UNIX/Linux shell to represent multiple filenames by using special characters called wildcards with a single file name. A wildcard is essentially a symbol which may be used to substitute for one or more characters. Therefore, we can use wildcards for generating the appropriate combination of file names as per our requirement.<br>Reference: https://www.linuxnix.com/10-file-globbing-examples-linux-unix/
  

Revision as of 10:35, 14 January 2020

ADVANCED UNIX / LINUX FILE MANAGEMENT

Main Objectives of this Practice Tutorial

  • Understand the difference between absolute / relative / relative-to-home pathnames
  • Become productive using various pathname types for Unix/Linux File Management
  • Understand the following Ambiguous Filename expansion (FNE) Symbols: * / ? / [ ] / [! ]
  • Become productive using FNE for Unix/Linux File Management
  • Understanding quotation symbols: Backslash \ , single quotes ' ' , double quotes " "
  • Understand the purpose of quoting special characters for File Management and issuing Linux commands


Tutorial Reference Material

Course Notes
Pathname Type / Filename Expansion / Quoting Reference
YouTube Videos
Course Notes:


Pathname Types

Filename Expansion Symbols

  • Asterisk * , Question ? ,
    Character Class [ ] and [! ]


Quotation Symbols Instructional Videos:

Pathname Types

A pathname is a fully-specified location of a unique filename within the file system.

The concept of a pathname relates to every operating system including Unix, Linux, MS-DOS, MS-Windows, Apple-Macintosh, etc.


It is important to understand file pathnames since you need to save or access a file without ambiguity because there may be several files by that name in various directories.

For example: Accessing the cars.txt file - which file to access? It depends on the location of the file

/home/userid/uli101/cars.txt
/public/uli101/samples/cars.txt
/etc/data/cars.txt


Absolute Pathnames

Directories in red display the FULL path from the root directory to the bin directory (i.e. the absolute pathname: /bin.
Directories in red display the FULL path from the root directory to the examples directory (i.e. the absolute pathname: /home/userid/uli101/examples.

An absolute pathname is a path to the file or directory always beginning from the root directory (i.e. / ).


This type of pathname is referred to as absolute because the pathname always begins from the root directory, regardless the location or your current directory. In other words, this type of pathname requires that you always provide the FULL pathname starting with the root directory.


Advantages of using Absolute Pathnames:

  • Useful if you do not know your current directory location
  • Easier to understand the FULL layout of pathname


Example:
mkdir /home/userid/uli101 will create the uli101 directory in the home directory of the user called: userid. This command is using an absolute pathname.

Relative Pathnames

Directories in red display the path from the current directory location (which is xyz100) to the bin directory (i.e. the relative pathname: ../../../bin.
Directories in red display the path from the current directory location (which is uli101) to the examples directory (i.e. the relative pathname: uli101/examples or ./uli101/examples

A relative pathname is a path to a file or directory that begins from your current directory. This is called relative because it is used to locate a specific file relative to your current directory.

NOTE: In order to use relative pathnames, it is absolutely necessary that you know the location of your current directory!


Relative Pathname Symbols:

. A period symbol "." represents the current directory
.. Two consecutive period symbols ".." represents the parent directory (one level up)


Advantages of using Relative Pathnames:

  • Possible shorter pathname (less typing)


For example: mkdir uli101 or mkdir ./uli101 will create the uli101 directory in your current directory.

Relative-to-home Pathnames

Directories in red display the path from the home directory of the current user (which is userid) to the examples directory (i.e. the relative-to-home pathname: ~/uli101/examples.
Directories in red display the path from the current directory location (which is uli101) to the examples directory (i.e. the relative pathname: uli101/examples or ./uli101/examples

You can specify a pathname as relative-to-home by using a tilde and slash at the start, e.g. ~/uli101/notes.html

The tilde character ~' is replaced by your home directory (typically /home/current-user-id)

You can immediately place a username after the tilde to represent another user’s home directory. For example: ~jane = /home/jane


Advantages of using Relative-to-home Pathnames:

  • Possible shorter pathname


Examples:

mkdir ~uli101 will create the uli101 directory in current user's home directory.
ls ~jane will display contents of jane's home directory (/home/jane).


NOTE: Deciding which type of pathname to use depends on many factors including: knowledge of current directory, knowledge of directory structure, currently directory location, and type of file management command that is being used.

Filename Expansion

Sometimes when issuing Linux commands, it could be more efficient to use a trick to process several files that share the same characteristic
(for example, the same extension, or the same file naming structure).


Examples:

You issued the ls command to view all of the files contained in your current directory:


ls
a.txt b.txt c.txt 1.txt 2.txt 3.txt abc.txt work.txt webpage.html picture.png


You now want to list just text files (i.e. files with the extension ".txt").
One method to do this is to issue the ls command and specify each file pathname as a separate argument:


ls a.txt b.txt c.txt 1.txt 2.txt 3.txt abc.txt work.txt
a.txt b.txt c.txt 1.txt 2.txt 3.txt abc.txt work.txt


But this method is inefficient: it requires a LOT of typing and knowing which filenames to include as separate arguments.
You can use a special character to indicate to the Bash shell to match all files that end with the extension ".txt":

Globbing is the process of expanding filenames as separate arguments that match an argument that uses a wildcard symbol (such as *).

ls *.txt
a.txt b.txt c.txt 1.txt 2.txt 3.txt abc.txt work.txt

As you can see, the last Linux command you issued requires the least amount of keystrokes (more efficient).


How Does this Work? (Process of Globbing)


File globbing is a feature provided by the UNIX/Linux shell to represent multiple filenames by using special characters called wildcards with a single file name. A wildcard is essentially a symbol which may be used to substitute for one or more characters. Therefore, we can use wildcards for generating the appropriate combination of file names as per our requirement.
Reference: https://www.linuxnix.com/10-file-globbing-examples-linux-unix/


As shown in the diagram on the right, when the ls command is issued with a filename expansion symbol (like *), the Bash shell searches for files that match the symbol (in this case all filenames that end with the extension ".txt") and expands the argument using the wildcards with those filenames as separate arguments. You do not see this happen in the shell, it is a process that occurs "behind the scenes".


Below are the most common Filename Expansion symbols and how they are used for filename expansion:


Filename Expansion SymbolPurpose
*Asterisk (*) to represent 0 or more characters
?Question mark (?) to represent exactly one character (any character)
[ ]Square brackets ([ ]) to represent and match for the character enclosed within the square brackets. It represents ONLY ONE character - its like a Question Mark (?) but with restrictions
[! ]Square brackets containing an exclamation mark immediately after the open square bracket ([! ]) to represent and match and OPPOSITE character for the character enclosed within the square brackets.



Quoting Special Characters

x

INVESTIGATION 1: ABSOLUTE / RELATIVE / RELATIVE-TO-HOME PATHNAMES

Dir12.png

The best way to learn about pathname types is to issue many Linux file management commands using each type (absolute, relative, relative-to-home) and see which ones (or combination) is the most efficient (requiring the least number of keystrokes).


Perform the Following Steps:

  1. Login your matrix account.

  2. Issue a command to confirm you are located in your home directory.

    Let's create the following directory structure under your home directory by issuing the mkdir command using only absolute pathnames.

    NOTE: The command you issue below will be VERY LONG... just keep typing and let the text continue of separate lines. When using these absolute pathnames, start each one from the root directory (/) and replace the text "youruserid" with your actual login id.

  3. Issue the following Linux command to create the directory structure displayed to the right using absolute pathnames:

    mkdir -p /home/youruserid/tutorial3/practice/commands /home/youruserid/tutorial3/practice/examples /home/youruserid/tutorial3/notes/lesson1 /home/youruserid/tutorial3/notes/lesson2

    Let's remove this directory structure, and issue the same command using a relative-to-home pathname.

  4. Issue the following Linux command (enter "y" at each prompt to remove ALL contents):
    rm -ri /home/youruserid/tutorial3

  5. Issue a command to confirm that the tutorial3 directory (and its contents) no longer exist. You should know how to do this.

    Let's recreate the same directory structure, but use a relative-to-home pathname. You usually generate the ~ character by Holding down SHIFT and press the button to the left of the number 1 above the text on your keyboard.

  6. Issue the following Linux command to create the same directory structure using relative-to-home pathnames:

    mkdir -p ~/tutorial3/practice/commands ~/tutorial3/practice/examples ~/tutorial3/notes/lesson1 ~/tutorial3/notes/lesson2

    Let's remove the tutorial3 directory and its contents and issue the mkdir command with relative pathnames to create the same directory structure.

  7. Issue the same command as you did in step 4 to remove tutorial3 and its contents safely.

  8. Issue a Linux command to confirm you removed the tutorial3 directory and its contents.

  9. Issue the following Linux command to create the same directory structure using relative pathnames:

    mkdir -p tutorial3/practice/commands tutorial3/practice/examples tutorial3/notes/lesson1 tutorial3/notes/lesson2

    QUESTION: Which command (pathname type) that you performed in steps 3 , 6 , and 9 required the LEAST number of keystrokes (i.e. characters)?

Dir13.png
You might start to think that issuing Linux file management commands are better using relative or relative-to-home pathnames instead of absolute pathnames, but this assumption may not always be correct.
Since the current directory location was your home directory, then it makes sense that using relative or relative-to-home pathnames are more efficient. On the other hand, what if we changed the location to a different directory? Then perhaps, using an absolute pathname would be preferable.
When performing the next series of steps, refer to the tree diagram on the right. It is HIGHLY RECOMMENDED to always refer to a tree diagram when issuing Linux using different pathnames. Learning to reference a tree diagram on a quiz, midterm or final exam can help to prevent errors and loss of marks!


Perform the Following Steps:

  1. Issue a Linux command to change to the examples directory in your recently-created directory structure.

  2. Issue a Linux command to confirm you are located in the examples directory.

  3. Remembering that we are located in the examples directory, issue the following Linux command using a relative pathname to display files in the /bin directory: ls ../../../../../bin

  4. Now issue the following Linux command using an absolute pathname: ls /bin

    Which type of pathname would be the best to use in this situation?

    NOTE: Although it would work, using the previous command using the relative-to-home pathname would work, but it would look weird. Try to issue the command yourself!

  5. Let's copy the file called ls which is contained in the /bin directory to your home directory by using the cp command. First, issue the following Linux command to copy the ls command from the /bin directory to your home directory using absolute pathnames: cp /bin/ls /home/youruserid

  6. Now let's issue the previous command using just relative pathname (remember, our current directory location is examples):
    cp ../../../../../bin/ls ../..

    TIP: For relative pathnames that move up multiple parent directories such as these, it is HIGHLY RECOMMENDED to view the tree diagram and check for the correct number of .. symbols. Students commonly make mistakes and lose marks on these type of questions!

  7. Let's issue the command using one absolute pathname and a relative pathname: cp /bin/ls ../..

  8. Let's issue the same command using one absolute pathname and a relative-to-home pathname: cp /bin/ls ~

    Which of the following file type combinations requires the LEAST number of keystrokes to copy the ls file to your home directory?

  9. Let's copy the ls file from the /bin directory to your current directory (i.e. examples): cp /bin/ls .

  10. x

INVESTIGATION 2: FILENAME EXPANSION

x

Perform the following steps:
  1. X

INVESTIGATION 3: QUOTING SPECIAL CHARACTERS

x


Perform the Following Steps:
  1. X



LINUX PRACTICE QUESTIONS

The purpose of this section is to obtain extra practice to help with your assignment #1, quizzes, your midterm, and your final ezam.

Here is a link to the MS Word Document of ALL of the questions displayed below but with extra room to answer on the document to simulate a quiz:

https://ict.senecacollege.ca/~murray.saul/uli101/uli101_week3_practice.docx

Your instructor may take-up these questions during class. It is up to the student to attend classes in order to obtain the answers to the following questions. Your instructor will NOT provide these answers in any other form (eg. e-mail, etc).


Review Questions:

  1. X
  2. X
  3. X
  4. X
  5. X
  6. X
  7. X
  8. X