Difference between revisions of "Bash notes"

From Noah.org
Jump to navigationJump to search
Line 7: Line 7:
 
</pre>
 
</pre>
  
== rename a group of files by extension ==
+
== Rename a group of files by extension ==
  
This is somewhat more clear
+
For example, rename all images from foo.jpg to foo_2.jpg.
 +
 
 +
This is somewhat more clear:
 
<pre>
 
<pre>
 
for filename in *.jpg ; do mv $filename `basename $filename .jpg`_2.jpg; done
 
for filename in *.jpg ; do mv $filename `basename $filename .jpg`_2.jpg; done
Line 17: Line 19:
  
 
<pre>
 
<pre>
for filename in *.jpg ; do mv $filename `basename $filename .jpg`_2.jpg; done
+
for filename in *.jpg ; do mv $filename ${filename%.jpg}_2.jpg; done
 
</pre>
 
</pre>
  

Revision as of 14:05, 20 February 2008


Turn off bash history for a session

set +o history

Rename a group of files by extension

For example, rename all images from foo.jpg to foo_2.jpg.

This is somewhat more clear:

for filename in *.jpg ; do mv $filename `basename $filename .jpg`_2.jpg; done

This is more "correct" and doesn't require `basename`:

for filename in *.jpg ; do mv $filename ${filename%.jpg}_2.jpg; done

Variable Expansion and Substitution

Bash can do some freaky things with variables. It can do lots of other substitutions. See "Parameter Expansion" in the Bash man page.

  • ${foo#pattern} - deletes the shortest possible match from the left
  • ${foo##pattern} - deletes the longest possible match from the left
  • ${foo%pattern} - deletes the shortest possible match from the right
  • ${foo%%pattern} - deletes the longest possible match from the right
  • ${foo=text} - If $foo exists and is not null then return $foo. If $foo doesn't exist then create it and set value to text.

Statements

Loop on filenames in a directory

for foo in *; do {
  echo ${foo}
}; done

Loop on lines in a file

for foo in $(cat data_file.txt); do {
  echo ${foo}
}; done