Welcome to the Linux Foundation Forum!

trouble with name increment

Posts: 7
edited January 2012 in Command Line

Hi,

I am trying to write a script that records a window on my screen. No pb with that.

To go further I would like to choose an incremental fileName for output incrementing if the fileName already exist.

I have trouble doing it so before dealing with the incrementation itself, I want to check I can substitute the calculated name in the ffmpeg command.

filename="~/Bureau/essai"

index=1 #I will deal with the incrementation of index after this part works

mystring="${fileName}${index}.mkv" #omce I have a proper index I concatenate the name with index and name extension

echo ${mystring} # gives ~/Bureau/essai1.mkv seems to be what I expect

ffmpeg -f alsa ..... -y ${mystring}


I get this message

~/Bureau/essai1.mkv No such file or directory

despite -y to force overwriting

However if I put the file name directly in the command like this

ffmpeg -f alsa ..... -y ~/Bureau/essai1.mkv

it works perfectly. My question is : "What is wrong ?"

Welcome!

It looks like you're new here. Sign in or register to get started.
Sign In

Comments

  • Posts: 2,177
    The script appears sane, so I do not see exactly what it wrong unless you have messed up something that is case sensitive, such as your use of the FileName variable when assigning to mystring.

    I have cleaned up the base script below:
    1. #!/bin/bash
    2. filename="~/Bureau/essai"
    3. index=1 #I will deal with the incrementation of index after this part works
    4. mystring="${filename}${index}.mkv" #omce I have a proper index I concatenate the name with index and name extension
    5. echo ${mystring} # gives ~/Bureau/essai1.mkv seems to be what I expect
    6. echo "ffmpeg -f alsa ..... -y ${mystring}"

    use that script to get the expected output, then try to copy and run the last output line to see if that differs from manual input.

    Once you get this working I can help you to handle the name increments and testing to see if files exist.
  • Posts: 7
    hi, thank you for your help.
    I did what you suggested and it works fine.

    But what to do after that ? I tried to put the last echo line between back tits but the error message is still the same.
    ~/Bureau/video1.mkv: No such file or directory
  • Posts: 7
    here is the full script (my first one -adaptation - so be indulgent)

    1. #!/bin/sh
    2. #la ligne précédente indique que c'est un script bash. IL ne doit y avoir aucun caractère ou espace avant.
    3. #Une ligne qui commence par un dièse est un commentaire. Comme cette ligne.
    4. #Nous informons l'utilisateur
    5. echo "\n Vous démarrez un enregistrement vidéo. Veuillez cliquer sur la fenêtre à enregistrer\n"
    6. #Nous demandons au système les informations sur la fenêtre cliquée
    7. INFO_FENETRE=$(xwininfo -frame)
    8. #la commande attend le clic
    9. #Nous affichons les informations
    10. echo "\n Information sur la fenêtre \n" $INFO_FENETRE+"\n\n"
    11. LARGEUR=$(echo $INFO_FENETRE | grep -oEe 'Width: [0-9]+' | grep -oEe '[0-9]+' )
    12. echo "Largeur trouvée : "$LARGEUR
    13. LARGEUR=$(($LARGEUR/2))
    14. LARGEUR=$(($LARGEUR*2))
    15. echo "Largeur corrigée : "$LARGEUR
    16. HAUTEUR=$(echo $INFO_FENETRE | grep -oEe 'Height: [0-9]+' | grep -oEe '[0-9]+')
    17. echo "Hauteur trouvée : "$HAUTEUR
    18. HAUTEUR=$(($HAUTEUR/2))
    19. HAUTEUR=$(($HAUTEUR*2))
    20. echo "Hauteur corrigée : "$HAUTEUR
    21. DECALAGE_FENETRE=$( echo $INFO_FENETRE | grep -oEe 'Corners:\s+\+[0-9]+\+[0-9]+' | grep -oEe '[0-9]+\+[0-9]+' | sed -e 's/\+/,/' )
    22. echo "Décalage fenêtre: "$DECALAGE_FENETRE"\n\n"
    23. #nous affichons la commande pour détection d'erreur s'il y a lieu.
    24. #echo "\n ffmpeg -f alsa -ac 1 -i hw:1,0 -acodec flac -f x11grab -s "$LARGEUR"x$HAUTEUR -i :0.0+$DECALAGE_FENETRE -r 10 -vcodec libx264 -vpre lossless_ultrafast ~/Bureau/essai.mkv "+"\n\n"
    25. #la commande proprement dite
    26.  
    27. filename="~/Bureau/video"
    28. index=1 #will deal with index later
    29. mystring="${filename}${index}.mkv"
    30. echo "ffmpeg -f alsa -ac 1 -i hw:1,0 -acodec flac -f x11grab -s $LARGEUR"x"$HAUTEUR -i :0.0+$DECALAGE_FENETRE -r 15 -vcodec libx264 -vpre lossless_ultrafast -y ${mystring}"

    the output is
    1. ffmpeg -f alsa -ac 1 -i hw:1,0 -acodec flac -f x11grab -s 1042x360 -i :0.0+ -r 15 -vcodec libx264 -vpre lossless_ultrafast -y ~/Bureau/video1.mkv

    and the output command works!

  • Posts: 7
    I went a little further

    This works (removing double quotes) :

    1. filename=~/Bureau/video
    2. index=1
    3. mystring=${filename}${index}.mkv
    4.  
    5. ffmpeg -f alsa -ac 1 -i hw:1,0 -acodec flac -f x11grab -s $LARGEUR"x"$HAUTEUR -i :0.0+$DECALAGE_FENETRE -r 15 -vcodec libx264 -vpre lossless_ultrafast -y ${mystring}

    but this doesn't (replacing ~ with /home/user)

    1. filename=/home/jaaf/Bureau/video #I am jaaf
    2. index=1
    3. mystring=${filename}${index}.mkv
    4.  
    5. ffmpeg -f alsa -ac 1 -i hw:1,0 -acodec flac -f x11grab -s $LARGEUR"x"$HAUTEUR -i :0.0+$DECALAGE_FENETRE -r 15 -vcodec libx264 -vpre lossless_ultrafast -y ${mystring}

    How comes ?
  • Posts: 2,177
    I took the original script and replaces the ~ with the $HOME variable and it was able to output into the correct file with no new errors, it looks like ffmpeg was having problems dealing with the ~ character when navigating the filesystem.
  • Posts: 7
    Ok thank you again.
    For my problem instead of using an index, I'll use a date based extension to the name like this :
    1. ffmpeg -f alsa -ac 1 -i hw:1,0 -acodec flac -f x11grab -s $LARGEUR"x"$HAUTEUR -i :0.0+$DECALAGE_FENETRE -r 15 -vcodec libx264 -vpre lossless_ultrafast -y video`date +%Y`.`date +%m`.`date +%H`.`date +%M`.`date +%S`.mkv &
  • Posts: 2,177
    The choice to use a date based assignment is better for organization and it should lead to no duplication, but it would not hurt to build error handling for duplicate names as a cautionary tool. Do you know how to use bash to check for existing files?
  • Posts: 7
    I read a bit about it but I cannot pretend I master it.
    I am very interrested in learing more as I am a beginner with bash scipting

    A few examples would be welcome.

  • Posts: 2,177
    edited January 2012
    Then here is a good example of filename error handling and implementing a formatted sequence number to force creation of a new valid name.
    1. #!/bin/bash
    2.  
    3. filedir="${HOME}/testscripts/emptydir/"
    4. filename="testfile"
    5. fileext=".txt"
    6.  
    7. # format the date as year-month-date so it can be easily sorted
    8. dt=$(date +"%y-%m-%d")
    9.  
    10. # loop through from 1 to 999
    11. # adding each three digit number to the filename
    12. # until a number that does not exist if found,
    13. # then make the file with the available name
    14.  
    15. # use the seq command to increment a number, it is being formatted
    16. # as a 3 digit number from 1 to 999
    17. for seqnum in $(seq -f "%03g" 1 999)
    18. do
    19. # set a filename including the directory, base name,
    20. # date, sequence number and the extension
    21. fullfile="${filedir}${filename}-${dt}-${seqnum}${fileext}"
    22.  
    23. # test the see if the file exist, first test to see
    24. # if it does not exist
    25. #
    26. # the ! means NOT
    27. # the -f tests to see if the file exists
    28. # so "! -f" means check to see if the file does not exist
    29. #
    30. if [ ! -f ${fullfile} ]
    31. then
    32. # since the file does not exist, make it
    33. touch ${fullfile}
    34. echo " ${fullfile} has been created"
    35.  
    36. # exit the loop since the file has been created
    37. break
    38. fi
    39. done
  • Posts: 7
    Thank you for this. I think I understand. I just have a little problem understanding the letter g in %03g (I am not a computer scientist even if already wrote programms in Java and C++). . I think I have to read the c printf function quietly.

  • Posts: 2,177
    Honestly it does not match the proper printf floating point syntax, I have been using it for a while after I found it on the net. I am assuming that the synax is stating to have leading zeros while forcing whole numbers to be three characters long.
  • Posts: 647
    1. for seqnum in $(seq -f "%03g" 1 999)

    Whats wrong with:
    1. for seqnum in {001..999}
  • Posts: 647
    1. filename="~/Bureau/essai"

    This assings the character "~" which is not replaced by your home directory. Your command failed because you don't have a file called "~/Bureau/essai"

    Now:
    1. filename=~/Bureau/video

    You don't know what you are doing there, do you? hehehe That's a binary operator like "==" That has nothing to do with "~" being your home directory!!! The command, however, should work although not with the expected file name ;)

    About these:
    1. but this doesn't (replacing ~ with /home/user)
    2.  
    3.  
    4. filename=/home/jaaf/Bureau/video #I am jaaf
    5.  
    6. index=1
    7.  
    8. mystring=${filename}${index}.mkv
    9.  
    10.  
    11.  
    12. ffmpeg -f alsa -ac 1 -i hw:1,0 -acodec flac -f x11grab -s $LARGEUR"x"$HAUTEUR -i :0.0+$DECALAGE_FENETRE -r 15 -vcodec libx264 -vpre lossless_ultrafast -y ${mystring}

    What's the output? Could it be possible that you didnt have the "Bureau" folder?

    General suggestions:

    1- ALWAYS ALWAYS ALWAYS use quotes
    2- use [[ instead of [
    3- ALWAYS use quotes
    4- don't use "break" it's bad programming style (generally) and you can do the same with a "while" and a variable to exit
    5- did I mention to ALWAYS use quotes?

    Regards
  • Posts: 2,177
    Marc,
    thanks for the input. I tried using "for seqnum in {001..999}" in a loop and it did not work, if you can correct the syntax I would love to note it for my uses.

    As for using break, I agree that it is generally bad to use it. However in this case where I was using a for loop to increment a number I was looking for something to exit the loop at the correct condition while using as few resources as possible. If you know a better was to do it while preserving the increments I would like to see it.
  • wow.. I think I slowly started to love scripting..
    Waiting for the prblem to be solved in this case.. :-)

    And Marc, ofcourse you mentioned, "ALWAYS", always ;-)
  • Posts: 647
    use the C style for

    for (( i=0,k=0;i<10,k<1;i++ ));do
    # This does what you need with the numbers
    printf "%02d" $i;
    # Whenever you reach the condition to exit the for loop
    k=1;
    done

    Regards

Welcome!

It looks like you're new here. Sign in or register to get started.
Sign In

Welcome!

It looks like you're new here. Sign in or register to get started.
Sign In

Categories

Upcoming Training