Loops

From Steak Wiki
Jump to navigationJump to search

Computers will have you spinning in your chair. Soul Coughing says that everything goes in circles, but that's incorrect, everything turns in spirals. You never return to point A. "You can't go home again."

Template Loop

This is a basic (bash) loop to operate on files.

for i in *.7z
 do name=`echo $i | cut -d'.' -f1`;
 echo $name;
 7z e -o"$name" ./"$i" 
done

Here's the above with comments included.

#!/bin/bash -x
#for i in *.webm;
        for i in *.7z
 do name=`echo $i | cut -d'.' -f1`;
 echo $name;

#for h264
# ffmpeg -i $i -s 1280x720 -c:a copy $name.mp4;

#for webm

#-map_metadata -1 is to remove metadata, at least try to remove some. (need to verify)
#ffmpeg -i $i -map_metadata -1 -c:v libvpx -crf 10 -b:v 1M -c:a libvorbis $name.webm
 7z e -o"$name" ./"$i" 
done

Basically, trim off extension of i, put into name. Use both for extractions/conversion.

One Liner Loop

while true; do echo "ok"; sleep 1; done

Batch remove EXIF data and resize photos

for i in *.{jpg,JPG,png,PNG}
do
  mogrify -strip $i
  convert $i -resize 240x180\! edit_$i 
done

verify the data is gone with

identify -verbose filename | grep exif

#note the \! is required to force it to ignore aspect ratio... also note that magick == convert

Keep Aspect ratio and rename

for i in *.jpg
 do 
 mogrify -strip $i               #remove evil exif data
 name=`echo $i | cut -d'.' -f1`; #remove extension
 echo $name;
 name=${name}edit_.jpg 
 convert  $i -resize 1440x $name #resizes only width. to resize only height, put the x first.
done

Above but add date

#!/bin/bash
DATE=$(date "+%Y_%m_%d")
for i in *.JPG
do
#delete exif data
mogrify -strip $i
#test convert size in gimp first to get ratio right
convert -resize 1080x810 $i ~/Desktop/photofolder/$DATE$i
done

rotate

for i in *.jpg
 do convert $i -rotate 90 $i; #use -90 for ccw
done

Interactive Range Loop

#!/bin/bash
for i in {1..254}; 
do 
some program that stalls goes here;
done

this will stop at the program, if it doesn't immediately complete so do this: ctrl - \

that will skip to the next range loop (i increments). note its not ctrl - c which will exit script. you can hold ctrl and depress \

What is CTRL - \? https://en.wikipedia.org/wiki/Signal_(IPC) One of the other options besides ctrl - c.


read file into command line by line

#!/bin/bash
input="text_file.txt"
while IFS= read -r line
do
  wget $line
done < "$input"

Obviously here, wget is the command being used. This example downloads from a text file with a list of URLs.