Home > Enterprise >  remove file command not working on spaces name
remove file command not working on spaces name

Time:03-22

my file name is

file_name = '19-00165_my-test - Copy (7)_Basic_sample_data'

my function is like

call("rm -rf /tmp/"   file_name   '.csv', shell=True)

but getting this error

/bin/sh: -c: line 0: syntax error near unexpected token `('

CodePudding user response:

My response always is: Don't use space in files.

But if you really want this, than you should place the files in quotes as such:

call("rm -f '/tmp/{0}.csv'".format(file_name), shell=True)

CodePudding user response:

Why are you using shell=True? That means the command will be passed to a shell for parsing, which is what's causing all the trouble. With shell=False, you pass a list consisting of the commands followed by its arguments, each as a separate list element (rather than all mashed together as a single string). Since the filename never goes through shell parsing, it can't get mis-parsed.

call(["rm", "-rf", "/tmp/"   file_name   '.csv'], shell=False)

CodePudding user response:

In order to avoid having problems with unescaped characters, one way is to use the shlex module:

You can use the quote() function to escape the string, it returns a shell-escaped version of the string:

import shlex

file_name = "19-00165_my-test - Copy (7)_Basic_sample_'data"

call(f"rm -f /tmp/{shlex.quote(file_name)}.csv", shell=True)
# rm -rf /tmp/'19-00165_my-test - Copy (7)_Basic_sample_'"'"'data'.csv

You can also use join():

import shlex

file_name = "19-00165_my-test - Copy (7)_Basic_sample_'data"

call(shlex.join(["rm", "-f", f"/tmp/{file_name}.csv"]), shell=True)
# rm -f '/tmp/19-00165_my-test - Copy (7)_Basic_sample_'"'"'data.csv'

Note: This answer is only valid if shell=True is required to make the command work. Otherwise the answer of @Gordon Davisson is way easier.

  • Related