How can I pass all arguments with xargs in middle of command in linux
This is one way to do it
pdftk $(ls | sort -n) cat output combinewd2.pdf
or using backtick
pdftk `ls | sort -n` cat output combinewd2.pdf
As pointed out in the comments this will not work on filenames containing spaces. In that case you could use eval
eval pdftk $(while IFS= read -r file; do echo \"$file\"done < <(ls | sort -n)) cat output combinewd2.pdf
Suppose there are two files named " 0 foo " and " 1 bar " then the result of eval would be the desired command, with the file names in double quotes:
pdftk " 0 foo " " 1 bar " cat output combinewd2.pdf
If the filenames might contain newlines, then use find
command, see discussion by @joeytwiddle in the comments of @andrewdotn's answer.The following solution also handles file names with double quotes using the sed
command to escape double quotes:
eval pdftk $(while IFS= read -r -d '' file; do echo \"$file\"done < <(find . -maxdepth 1 -type f -print0 | \ sed 's/"/\\"/g'| sort -zn)) cat output combinewd2.pdf
It’s ugly, but you can run sh -c
and access the list of arguments passed by xargs
as "${@}"
, like so:
ls | sort -n | xargs -d'\n' sh -c 'pdftk "${@}" cat output combinewd2.pdf' "${0}"
The extra "${0}"
at the end is there because, as the sh
man page says
-c string
If the -c option is present, then commands are read from string. If there are arguments after the string, they are assigned to the positional parameters, starting with $0.
To test this, let’s first create some files with complicated names that will mess up most other solutions:
$ seq 1 100 | xargs -I{} touch '{} with "spaces"'$ ls1 with "spaces" 31 with "spaces" 54 with "spaces" 77 with "spaces"10 with "spaces" 32 with "spaces" 55 with "spaces" 78 with "spaces"100 with "spaces" 33 with "spaces" 56 with "spaces" 79 with "spaces"11 with "spaces" 34 with "spaces" 57 with "spaces" 8 with "spaces"12 with "spaces" 35 with "spaces" 58 with "spaces" 80 with "spaces"13 with "spaces" 36 with "spaces" 59 with "spaces" 81 with "spaces"14 with "spaces" 37 with "spaces" 6 with "spaces" 82 with "spaces"15 with "spaces" 38 with "spaces" 60 with "spaces" 83 with "spaces"16 with "spaces" 39 with "spaces" 61 with "spaces" 84 with "spaces"17 with "spaces" 4 with "spaces" 62 with "spaces" 85 with "spaces"18 with "spaces" 40 with "spaces" 63 with "spaces" 86 with "spaces"19 with "spaces" 41 with "spaces" 64 with "spaces" 87 with "spaces"2 with "spaces" 42 with "spaces" 65 with "spaces" 88 with "spaces"20 with "spaces" 43 with "spaces" 66 with "spaces" 89 with "spaces"21 with "spaces" 44 with "spaces" 67 with "spaces" 9 with "spaces"22 with "spaces" 45 with "spaces" 68 with "spaces" 90 with "spaces"23 with "spaces" 46 with "spaces" 69 with "spaces" 91 with "spaces"24 with "spaces" 47 with "spaces" 7 with "spaces" 92 with "spaces"25 with "spaces" 48 with "spaces" 70 with "spaces" 93 with "spaces"26 with "spaces" 49 with "spaces" 71 with "spaces" 94 with "spaces"27 with "spaces" 5 with "spaces" 72 with "spaces" 95 with "spaces"28 with "spaces" 50 with "spaces" 73 with "spaces" 96 with "spaces"29 with "spaces" 51 with "spaces" 74 with "spaces" 97 with "spaces"3 with "spaces" 52 with "spaces" 75 with "spaces" 98 with "spaces"30 with "spaces" 53 with "spaces" 76 with "spaces" 99 with "spaces"$ ls | sort -n | xargs -d'\n' sh -c 'set -x; pdftk "${@}" cat output combinewd2.pdf' "${0}"+ pdftk '1 with "spaces"' '2 with "spaces"' '3 with "spaces"' '4 with "spaces"' '5 with "spaces"' '6 with "spaces"' '7 with "spaces"' '8 with "spaces"' '9 with "spaces"' '10 with "spaces"' '11 with "spaces"' '12 with "spaces"' '13 with "spaces"' '14 with "spaces"' '15 with "spaces"' '16 with "spaces"' '17 with "spaces"' '18 with "spaces"' '19 with "spaces"' '20 with "spaces"' '21 with "spaces"' '22 with "spaces"' '23 with "spaces"' '24 with "spaces"' '25 with "spaces"' '26 with "spaces"' '27 with "spaces"' '28 with "spaces"' '29 with "spaces"' '30 with "spaces"' '31 with "spaces"' '32 with "spaces"' '33 with "spaces"' '34 with "spaces"' '35 with "spaces"' '36 with "spaces"' '37 with "spaces"' '38 with "spaces"' '39 with "spaces"' '40 with "spaces"' '41 with "spaces"' '42 with "spaces"' '43 with "spaces"' '44 with "spaces"' '45 with "spaces"' '46 with "spaces"' '47 with "spaces"' '48 with "spaces"' '49 with "spaces"' '50 with "spaces"' '51 with "spaces"' '52 with "spaces"' '53 with "spaces"' '54 with "spaces"' '55 with "spaces"' '56 with "spaces"' '57 with "spaces"' '58 with "spaces"' '59 with "spaces"' '60 with "spaces"' '61 with "spaces"' '62 with "spaces"' '63 with "spaces"' '64 with "spaces"' '65 with "spaces"' '66 with "spaces"' '67 with "spaces"' '68 with "spaces"' '69 with "spaces"' '70 with "spaces"' '71 with "spaces"' '72 with "spaces"' '73 with "spaces"' '74 with "spaces"' '75 with "spaces"' '76 with "spaces"' '77 with "spaces"' '78 with "spaces"' '79 with "spaces"' '80 with "spaces"' '81 with "spaces"' '82 with "spaces"' '83 with "spaces"' '84 with "spaces"' '85 with "spaces"' '86 with "spaces"' '87 with "spaces"' '88 with "spaces"' '89 with "spaces"' '90 with "spaces"' '91 with "spaces"' '92 with "spaces"' '93 with "spaces"' '94 with "spaces"' '95 with "spaces"' '96 with "spaces"' '97 with "spaces"' '98 with "spaces"' '99 with "spaces"' '100 with "spaces"' cat output combinewd2.pdf
All the arguments are quoted correctly. Note that this will fail if any filenames contain newlines, and that ls -v
is basically ls | sort -n
.