0

I am calling a script from a script and passing a positional argument {folder} — whose value is a path that contains spaces so it needs to be quoted.

The second script is:

#!/bin/bash -xu
find "$1" -type f -iname "*.srt" | grep -v -e "\\.eng" -e "].srt" -e "].[0-9].srt" | while read -r file; do trash -F "$file";done;

I have been unsuccessful in adding quotes around the path variable $1. (I am guessing this is the issue, I would like to log all of the output to pinpoint it but not sure how to do that either)

I tried escaping it but that did not work \""$1"\"

The first script:

#!/bin/bash
filebot -exec /Users/john/.filebot/scripts/delete_non-english_subtitles.sh {folder}

The second script:

find "$1" -type f -iname "*.srt" | grep -v -e "\\.eng" -e "].srt" -e "].[0-9].srt" | while read -r file; do trash -F "$file";done; \
echo "$1" >> ~/Desktop/SsubDeletetest.txt; \
echo "$1" | awk -F"/" '{ print $NF }' >> ~/Desktop/subtitletest.txt; \

I added the echo lines to get an idea of how the argument value was formatted. Those two echo lines are working. There is output in those txt files. But the Find command never runs when called. I can run the same Find commands in terminal when I quote the path but argument apparently doesn't get quoted because at the first space in the path value the path is clipped.

I should add that the first script is being called by an application, not in Terminal. So the only way to see the results is to output to a text file... I think.

  1. Your post-process script is just deleting *.srt files, so that'd be a rather straight-forward -exec use case. You'll want to refactor that into it's own standalone script and then have filebot call it via -exec on the destination folder as explained above.

Here's what the call stack would look like:

1. qBT calls your qBT_e-program.sh
1.1. qBT_e-program.sh calls filebot
1.1.1. filebot -exec calls your delete-srt-files.sh passing along the destination {folder} as Argument $1
1.1.1.1. delete-srt-files.sh calls find "$1" ...```

Adding more to help troubleshoot. Still stuck on this. I learned how to get some output and have some clues but can't figure the issue out.

Again, When I add the path into the script instead of using the quoted variable "$1", the script works. When I use the variable it fails and results in this error output. This is being called from the initial script with quoted argument "{folder}". I have tried variations on treating the variable: "{$1}" \""$1"\" "$1/" -$1. I thought maybe the filebot -exec command was already quoting the variable and my quotes were actually unquoting it.

+ read -r file
find: /Volumes/PlexMedia/PlexServer_1/Movies/Paper: No such file or directory
find: Lives: No such file or directory
find: (2021)/Paper: No such file or directory
find: Lives: No such file or directory
find: (2021): No such file or directory
find: {imdb-tt13045890}: No such file or directory
find: [[en]: No such file or directory
find: 2.40∶1: No such file or directory
find: WS: No such file or directory
find: 1080p: No such file or directory
find: WEB-DL: No such file or directory
find: x265: No such file or directory
find: 584ECE9D].mp4: No such file or directory
echo result /Volumes/PlexMedia/PlexServer_1/Movies/Paper Lives (2021)/Paper Lives (2021) {imdb-tt13045890} [[en] 2.40∶1 WS 1080p WEB-DL x265 584ECE9D].mp4

I can see the variable is being split at the spaces. But it's quoted! This is a different file but same script calling it form Terminal:

Sat Mar 13 12:12:30
iMac191:Klara (2010) john$ /Users/john/.filebot/scripts/delete_non-english_subtitles.sh
+ path='/Volumes/PlexMedia/PlexServer_1/Movies/Test Folder (1968)'
+ find '/Volumes/PlexMedia/PlexServer_1/Movies/Test Folder (1968)' -type f -iname '*.srt'
+ grep -v -e '\.eng' -e '].srt' -e ']\.[0-9].srt'
+ read -r file
+ trash -F '/Volumes/PlexMedia/PlexServer_1/Movies/Test Folder (1968)/moviename.swe.srt'
+ read -r file
7
  • Please add details on how you call it and on the error you get. – nohillside Mar 12 at 19:40
  • @nohillside Amended above in original post. – John Mar 12 at 20:03
  • 1
    What is {folder}, this isn‘t bash syntax? Also, use single quotes unless you want the shell to expand the content of a string (you won‘t have this the parameter passed after -iname for instance) – nohillside Mar 12 at 20:15
  • 1
    Overall we still lack specifics, can you show us the output you get in the shell. We can‘t see your screen :-) – nohillside Mar 12 at 20:17
  • I was told that {folder} is the positional argument from the filebot executable that gets passed to the next script.. although that may be my misunderstanding. I added the developers suggestion on how to write the script stack. – John Mar 12 at 20:18
2

You've done it correctly in your example.
"$1" will be replaced with "parameter content", quoted.

You can test this by minimising your code further.

#!/bin/bash
find "$1"

This works perfectly:

$ ./find1.sh "foo bar"
foo bar/.DS_Store
foo bar/test
foo bar/test.xcodeproj
foo bar/testUITests
foo bar/testTests

This demonstrates the parameter to the script being correctly provided to the find command.

Your issue must be elsewhere. Make sure you're calling the script with the correct quoting too!

To see how variables are replaced with their contents, add set -x after the shebang.

#!/bin/bash
set -x
find "$1"

Commands run after set -x will be printed prefixed with +, showing the variable substitution:

$ ./find1.sh "foo bar"
+ find 'foo bar'
foo bar/.DS_Store
…

Based on the additional calling script added, it can be seen that the presumption was correct — the script is not being called quoted.

#!/bin/bash
filebot -exec … {folder}

The {folder} is not quoted, so each space separated argument is given as a separate argument.

You need to quote "{folder}" so it's one argument.

echo prints all arguments space separated, so it's not suitable to determine errors in this way.

3
  • I updated the original post with more detail. Thank you. – John Mar 12 at 20:14
  • @John Thanks, this demonstrates the issue as I presumed, see edit – grg Mar 12 at 20:17
  • still having issues. I was confident what you wrote would solve this but it did not. I am stuck. I added more above if it helps. – John Mar 14 at 4:12
0

It would be helpful to understand more specifically what you are trying to accomplish.

However, using your post as a starting point, I would start with this:

find "${1}" -type f -iname '*.srt' -print | while read line
do

    echo "$line"

done

and then try your grep commands on the echo "$line"

There is also:

find "${1}" -type f -iname '*.srt' -print0 | xargs -0 foo

which will run foo on the output of find.

You must log in to answer this question.

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