0

This question already has an answer here:

I have a script that takes filenames as positional parameters. I perform a few operations on these and then tar them. Currently my script is not working. The echo line is there for debugging purposes.

Please clarify this statement

But when I try to tar with in the script if can file the file I want to tar.

SNIPPET

while [[ $# > 0 ]]; do
    key="$1"
    shift
    files=$files" "\"${key}\"
 done

echo tar -cvf backup.tar $files
tar -cvf backup.tar $files

OUTPUT:

tar -cvf backup.tar "test.txt"
tar: "test.txt": Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

I am using the double quotes around the filename (test.txt) as I want to handle files with spaces.

If I were to remove the quotes in the script (\"), it will work but then I can’t handle filenames with spaces.

Any ideas?

marked as duplicate by Scott, peterh, Romeo Ninov, Stephen Rauch, Satō Katsura Oct 14 '17 at 8:05

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

  • 1
    Why not just pass the file params directly to tar? tar -cvf backup.tar "$@" ? – B Layer Oct 14 '17 at 0:29
  • what about: files="$files \"${key}\""? Or use an array...files+=("$key") and then tar -cvf backup.tar ${files[@]} – Jesse_b Oct 14 '17 at 0:32
  • See But what if …? – Scott Oct 14 '17 at 0:38
  • Wouldn't he need the $files variable in the tar statement unquoted though? Otherwise, wont they be treated as one argument? – Jesse_b Oct 14 '17 at 0:44
  • Use capital letters. – peterh Oct 14 '17 at 1:34
3

If you are always using all the params then just call tar like this: tar -cvf backup.tar "$@". Otherwise, if you are selecting a subset (though you don't show it) then build up the file list in an array like this:

declare -a files
while [[ $# > 0 ]]; do
    key="$1"
    shift
    # assume some filtering goes on here
    files+=("$key")
 done

tar -cvf backup.tar "${files[@]}"
  • excellent this work using the array and quoting when adding to the array. Thanks a million. – goldengreen Oct 14 '17 at 1:09

Not the answer you're looking for? Browse other questions tagged or ask your own question.