How can I pass all arguments with xargs in middle of command in linux

前端 未结 8 2085
一个人的身影
一个人的身影 2020-12-09 08:37

I want to pass all the files as a single argument on Linux but I am not able to do that.

This is working

ls | sort -n | xargs  -i pdftk  {} cat outpu         


        
8条回答
  •  情话喂你
    2020-12-09 09:06

    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"'
    $ ls
    1 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.

提交回复
热议问题