• BASH > xargs

      The xargs command in UNIX is a command line utility for building an execution pipeline from standard input. Whilst tools like grep can accept standard input as a parameter, many other tools cannot. Using xargs allows tools like echo and rm and mkdir to accept standard input as arguments.

      How to use xargs

      By default xargs reads items from standard input as separated by blanks and executes a command once for each argument. In the following example standard input is piped to xargs and the mkdir command is run for each argument, creating three folders.

      echo 'one two three' | xargs mkdir
      ls
      one two three

      How to use xargs with find

      The most common usage of xargs is to use it with the find command. This uses find to search for files or directories and then uses xargs to operate on the results. Typical examples of this are removing files, changing the ownership of files or moving files.

      find and xargs can be used together to operate on files that match certain attributes. In the following example files older than two weeks in the temp folder are found and then piped to the xargs command which runs the rm command on each file and removes them.

      find /tmp -mtime +14 | xargs rm

      xargs v exec {}

      The find command supports the -exec option that allows arbitrary commands to be found on files that are found. The following are equivalent.

      find ./foo -type f -name "*.txt" -exec rm {} \;
      find ./foo -type f -name "*.txt" | xargs rm

       

      So which one is faster? Let’s compare a folder with 1000 files in it.

      time find . -type f -name "*.txt" -exec rm {} \;
      0.35s user 0.11s system 99% cpu 0.467 total
      
      time find ./foo -type f -name "*.txt" | xargs rm
      0.00s user 0.01s system 75% cpu 0.016 total

       

      Clearly using xargs is far more efficient. In fact several benchmarks suggest using xargs over exec {} is six times more efficient.

      How to print commands that are executed

      The -t option prints each command that will be executed to the terminal. This can be helpful when debugging scripts.

      echo 'one two three' | xargs -t rm
      rm one two three

      How to view the command and prompt for execution

      The -p command will print the command to be executed and prompt the user to run it. This can be useful for destructive operations where you really want to be sure on the command to be run. l

      echo 'one two three' | xargs -p touch
      touch one two three ?...

      How to run multiple commands with xargs

      It is possible to run multiple commands with xargs by using the -I flag. This replaces occurrences of the argument with the argument passed to xargs. The following prints echos a string and creates a folder.

      cat foo.txt
      one
      two
      three
      
      cat foo.txt | xargs -I % sh -c 'echo %; mkdir %'
      one
      two
      three
      
      ls
      one two three

      Further reading

      PASSER DES VARIABLES

      How can a global script variable be passed to the command of xargs? I tried it this way:

       

      TEST=hallo2
      echo "hallo" | xargs sh -c 'echo passed=$1 test=$TEST' sh
      passed=hallo test=

       

      I know I could use the {} token but I need to do it this way!

      I’m using bash.

      linux bash variables xargs

      try using export TEST=hallo2

      It’s the safest, most correct approach.

      Take variable $TEST out from the quotes:

       

       TEST=hallo2
       echo "hallo" | xargs sh -c 'echo passé=$1 test='$TEST sh

       

      If you take this approach, you should double-quote $TEST to guard against it containing whitespace.

       

      export the variable TEST:

      export TEST=hallo2
      echo "hallo" | xargs sh -c 'echo passed=$1 test="$TEST"' sh

       

 

Aucun commentaire

 

Laissez un commentaire