Xargs Should Be In Your Command Line Toolbag

Sdílet
Vložit
  • čas přidán 17. 07. 2021
  • Xargs is an important shell utility to know because it allows you to execute to pass standard input as an argument to another command. While many command line programs allow standard input to be used as a parameter (things like grep, sed, awk etc.), many other programs do not allow for this (such as echo and rm). This is where Xargs comes in handy.
    REFERENCED:
    ► man7.org/linux/man-pages/man1...
    WANT TO SUPPORT THE CHANNEL?
    💰 Patreon: / distrotube
    💳 Paypal: www.paypal.com/cgi-bin/webscr...
    🛍️ Amazon: amzn.to/2RotFFi
    👕 Teespring: teespring.com/stores/distrotube
    DONATE CRYPTO:
    💰 Bitcoin: 1Mp6ebz5bNcjNFW7XWHVht36SkiLoxPKoX
    🐶 Dogecoin: D5fpRD1JRoBFPDXSBocRTp8W9uKzfwLFAu
    📕 LBC: bMfA2c3zmcLxPCpyPcrykLvMhZ7A5mQuhJ
    SOCIAL PLATFORMS:
    🗨️ Mastodon: distrotoot.com/@derek
    👫 Reddit: / distrotube
    📽️ LBRY/Odysee: odysee.com/$/invite/@DistroTu...
    DT ON THE WEB:
    🕸️ Website: distrotube.com/
    🐿️ Gemini Capsule: gemini://distro.tube
    📁 GitLab: gitlab.com/dwt1
    FREE AND OPEN SOURCE SOFTWARE THAT I USE:
    🌐 Brave Browser - brave.com/dis872
    📽️ Open Broadcaster Software: obsproject.com/
    🎬 Kdenlive: kdenlive.org
    🎨 GIMP: www.gimp.org/
    🎵 Ardour: ardour.org/
    💻 VirtualBox: www.virtualbox.org/
    🗒️ Doom Emacs: github.com/hlissner/doom-emacs
    Your support is very much appreciated. Thanks, guys!
  • Věda a technologie

Komentáře • 209

  • @first-thoughtgiver-of-will2456

    I've been writing bash scripts for years now and never bothered to thoroughly read the documentation. I have always used an inferior work around for this thank you for showing me the formal solution.

    • @thecashewtrader3328
      @thecashewtrader3328 Před 2 lety

      Yay uwu

    • @swindlesmccoop
      @swindlesmccoop Před 2 lety

      yes i always would just set whatever i needed as a variable and use that but sometimes it just wouldnt work

  • @sasakanjuh7660
    @sasakanjuh7660 Před 2 lety +30

    Just a tip, if you are trying to create a bunch of sequentially numerated files with touch, you can use bash ranges {} syntax, like "touch {1..1000}".. It's really convenient, and it works with other types of sequences (a..z), and you can even pass a step in which next item will be incremented :)
    Nice video, btw! :)

  • @InfiniteQuest86
    @InfiniteQuest86 Před 2 lety +22

    xargs is a true lifesaver when it's needed. One key example is when you have a tool that needs to run on every file in a directory. Using ls and xargs with -n 1 can really blast out the results compared to trying to bash for loop it or something. The problem is people don't even know about it to consider it as an option.

    • @vikingthedude
      @vikingthedude Před 2 lety

      Yeah I've always struggled to write bash for-loops because 1) They look kinda noisy when written inline and 2) I don't usually write my code in bash. With 'ls -1 | xargs' (or with -n 1 like you said) the command looks so much cleaner and is more declarative

  • @Hifonics78
    @Hifonics78 Před 2 lety +56

    Thank you DT for all what you do.

  • @emiliadaria
    @emiliadaria Před 2 lety +64

    Hey DT, your comparison of "-exec" and "xargs" wasn't entirely fair.
    Using -exec with the semicolon is more similar to calling xargs with the "-L 1" option. A fair comparison would be to use "find ... -exec rm {} +". The "+" tries to fit as many arguments to one command as it can just like xargs by default.

    • @sorrowfulevening8201
      @sorrowfulevening8201 Před 2 lety +1

      @Terminalforlife (LL) rm -f *.txt will do the job, no need for find.

    • @amx2311
      @amx2311 Před 2 lety +1

      @@sorrowfulevening8201 except the find results are not necesarily always in the same folder, nor will you know in what folders the results will pop up.

    • @sorrowfulevening8201
      @sorrowfulevening8201 Před 2 lety

      @@amx2311 agree.

    • @fagcinsk
      @fagcinsk Před 2 lety

      @@amx2311 ... or if you have too many files to fit to arguments length.

  • @Mr76Pontiac
    @Mr76Pontiac Před 2 lety +11

    XARGS is one of those insanely useful tools. It's something in my toolbox that I use EVERY day when I manage any one of the hundreds of servers I could be dealing with each day.
    Just for clarification, XARGS doesn't make FIND any more or less efficient. FIND will execute the RM statement (Or whatever it's internal equivalent is) for each result it returns. XARGS will pass as many parameters to RM (or whatever command) as it can if you don't set a limit on the number of parameters to pass in. That means that the RM command may be run multiple times against a large number of files/parameters. RM is intelligent with file transactions, just the same as relational databases are intelligent with their ACID transactions.
    As an example to really put this to the test:
    for c in `seq 100`
    do
    echo "----"
    echo "${c} step"
    echo "Creating Files"
    time seq 1000 | xargs -i touch {}.txt
    echo "Running RM with ${c} parameters"
    time find . -type f -name '*.txt' | xargs -n ${c} rm
    done
    This will start a loop. In each loop, it'll create 1000 files, then promptly delete them passing a number of files/parameters to be deleted each loop. So on loop one, a single file/parameter will be passed to RM for it to be deleted. On the second pass, two files will be passed to RM, etc.
    Note that `seq 100` is wrapped in the BACK-TICKS (Unshifted-Tilde key on standard US keyboards, at least), it's not a standard single quote.

  • @phylwx
    @phylwx Před 2 lety +20

    You're content is getting way better DT, congrats! I love this vid, really nice info.

  • @pavelsapehin4308
    @pavelsapehin4308 Před 3 měsíci

    Great structured intro into xargs, thanks DT!
    Here is an approximate ToC for this video:
    00:48 basic xargs usage + echo
    02:03 xargs -t flag = show expanded output
    02:55 xargs + ls = recursive ls
    03:36 example: /etc/passwd
    04:00 passwd + cut + sort + xargs
    04:41 xargs -I (capital i) flag = alias for arguments
    06:19 example: make 1000 txt files: seq + xargs + touch
    07:21 example: mv *.txt to *.text with ls + cut + xargs
    08:35 xargs -n flag (number of args) = multiline output with
    09:39 example: seq + xargs + bash + sleep
    11:34 example: xargs + find = remove all *.text
    13:50 performance: find --exec vs xargs rm
    15:18 summary
    This table of content was created using "Smart Bookmarks for CZcams" chrome extension.

  • @stephenflee7989
    @stephenflee7989 Před rokem +1

    Hands down the best rundown of xargs I've ever seen, you rock my dude!

  • @fennecbesixdouze1794
    @fennecbesixdouze1794 Před rokem +1

    This was an incredibly well written and produced video. Really spectacular job running down this command.

  • @davidh.4944
    @davidh.4944 Před rokem +2

    Rather than xargs, I've recently been learning how to use GNU parallel, and I love it. Its syntax is more cumbersome to work with than xargs, but it's also much more powerful. You can interleave multiple inputs (e.g. from stdin and files at the same time), position the incoming strings in any order you want in your command, and modify them before use (e.g. to remove file paths). You can even distribute jobs over multiple machines via ssh.
    I've updated a few of my scripts to use it and the results have been exceptional. For example I have one script for converting flac files to vorbis, ensuring that the filename, tags, and art are all kept intact, and the time to process one album of tracks dropped from about 3 minutes to under 20 seconds. Sweet.

  • @matthewlandry1352
    @matthewlandry1352 Před 2 lety +1

    Never knew about xargs! Neither did my spellchecker. Now we both do! Thanks DT

  • @s4degh
    @s4degh Před rokem +1

    These command line utility videos are amazing. Thank you for the content.

  • @alexb3617
    @alexb3617 Před rokem +1

    very informative video, it literally answered all my questions. meaning all important points were considered and answered, like different use cases and comparisons with other similar tools, which is preferable in which scenario and so on. very good work indeed

  • @GonzaloOviedoLambert
    @GonzaloOviedoLambert Před 2 lety

    Thank you, very clear explanation and tested and documented. After 17 years, finally I will use xargs

  • @gonzalooviedo5435
    @gonzalooviedo5435 Před rokem

    From Chile, thanks for your dedication and your team also, you are doing fantastic work every day, like the format of your videos and your english is very good, thanks for not talking fast!. I'm addicted to linux.

  • @genkiferal7178
    @genkiferal7178 Před 4 měsíci

    The lighting in this video is flattering for your blue or green eyes.

  • @filipemarques9144
    @filipemarques9144 Před 2 lety

    Awesome!
    This is one of my favorite channels!
    Congrats!

  • @ryanporidge1517
    @ryanporidge1517 Před 2 lety +5

    Love the new bash tuts! Looking forward to more

  • @leroyonlinux283
    @leroyonlinux283 Před 2 lety

    I love this videos explaining those basic CLI tools. Because if you don't know they exist, its hard to find them. ESpecially for new users.

  • @locatemarbles
    @locatemarbles Před 2 lety +2

    Great timing DT. Was experimenting yesterday with fzf -m in combination with xargs and couldn't get the multiple inputs working. Them damn curly braces. Thank you.

  • @guyboisvert66
    @guyboisvert66 Před 2 lety +1

    This is really useful! I made a script that processed several million files, output from the find command using -print0 and xargs with the -0 argument (for using paths / filenames with spaces) and launching another script, 16 of them in parallel with -n1 and -P16 arguments to xargs. The performance was phenomenal: the Dual Xeon E5-2660v2 (2 x 8 cores) usage was up to 95%, averaging about 80%. This is multi-threading bash scripting!

  • @jezbon
    @jezbon Před 11 měsíci +1

    It's still amazing that decades after shell and all these little tools were created for Unix that they're still insanely awesome. Still. That's just mindblowing. They were designed as the best operating system/logic building blocks of all time. Just a wonder of human ability to have nailed this.

  • @johnarleevillarivera286

    Nice explanation DT. Just found out about this channel what a gem.

  • @kGetMail
    @kGetMail Před 2 lety

    Another great video from DT. Many thanks.

  • @oneanime5551
    @oneanime5551 Před 2 lety +1

    Thank you DT for this amazing video!!!

  • @JustinBumpusBarnett
    @JustinBumpusBarnett Před 2 lety +2

    Good stuff my dude. I had to open up a terminal and try this out myself.

  • @crazychicken0378
    @crazychicken0378 Před 2 lety +3

    Thanks again for these command line tutorials. I might honestly start scripting soon for really simple actions. Your videos are definitely where I look for information on all that. I might honestly learn posix shell script or bash or something haha

    • @paulstaf
      @paulstaf Před 2 lety

      I use bash and expect scripting exclusively to manage Cisco devices in an enterprise environment. Don't have to worry about libraries from other programming languages being installed on whatever system I am using at the time.

  • @kennyray1640
    @kennyray1640 Před 2 lety

    What a great video! I look forward to watching more!

  • @ziangtian
    @ziangtian Před 8 měsíci

    This is truly much better than reading the manual pages! loved the accent btw :)

  • @gibraanjafar1669
    @gibraanjafar1669 Před 2 lety +1

    Lovely explanation. Thanks a ton DT

  • @phamh79
    @phamh79 Před 2 lety +2

    thank you DT, love your content.

  • @combsmsteven
    @combsmsteven Před 2 lety

    Just discovered your channel, love it

  • @bhaveshverma8629
    @bhaveshverma8629 Před 2 lety +1

    Very Very awesome video. So much to learn.

  • @Linux.Learner
    @Linux.Learner Před 2 lety +1

    AWESOME SIRE! Much respect.

  • @qball8up1968
    @qball8up1968 Před 2 lety

    Nicely done DT.

  • @fintarabg
    @fintarabg Před 2 lety +1

    So useful, and so well explained!

  • @charliekim2939
    @charliekim2939 Před rokem

    I am learning a lot of command line tips and tricks from you. Thanks. By the way, you frequently use 'clear' to clear screen. You could use ctrl-l (el, not ai) to do the same, which saves a few finger movements.

  • @smit17xp
    @smit17xp Před 2 lety +2

    Thanks. This will be very time saving

  • @minhthuan4479
    @minhthuan4479 Před 2 lety +1

    That's such a cool command. I like it.

  • @janekmachnicki2593
    @janekmachnicki2593 Před 18 dny

    Thanks for another briliant tutorial

  • @subtitles1492
    @subtitles1492 Před 2 lety

    very useful and perfectly demonstrated. 👍🏻

  • @amanwehib8367
    @amanwehib8367 Před rokem +1

    Very good explanation!!!!!!

  • @DiegoArcega1
    @DiegoArcega1 Před 2 lety

    Awesome video, I learned something new, thank you

  • @markmcdonnell
    @markmcdonnell Před 2 lety

    I'm also impressed by perf of xargs

  • @isoEH
    @isoEH Před 2 lety

    Thanks! Learned several things here.

  • @oleksiizatkhei7178
    @oleksiizatkhei7178 Před 2 lety +1

    Wow, cool explanation. Thank you

  • @alisafapour9380
    @alisafapour9380 Před 10 měsíci

    Thank you. Very helpful.

  • @robertszakats148
    @robertszakats148 Před 2 lety

    Very useful video! Thank you!

  • @jaimeseuma6969
    @jaimeseuma6969 Před rokem

    That's a nice tutorial! thanks a lot for it

  • @James-ej4lb
    @James-ej4lb Před 2 lety

    Great video DT thanks

  • @szevaa97
    @szevaa97 Před 2 lety +1

    Thank you very much for this video

  • @greob
    @greob Před 2 lety

    Nice demonstration, thanks!

  • @Chiqc
    @Chiqc Před rokem

    beautiful video, thank you sir

  • @hupa1a
    @hupa1a Před 2 lety +1

    Great video!

  • @thanhtungvu3216
    @thanhtungvu3216 Před 2 lety

    It's so cool xargs. Thank you!

  • @AngelFelizF
    @AngelFelizF Před rokem

    Thanks, excellent video

  • @n0kodoko143
    @n0kodoko143 Před 2 lety +1

    Love ya DT!! thank you!

  •  Před 9 měsíci

    Thank you, very much, my friend!

  • @stefanocardarelli9201
    @stefanocardarelli9201 Před 2 lety

    A pearl as usual. Keep it up dt

  • @rc4652
    @rc4652 Před 2 lety +2

    This is very very cool.

  • @YannMetalhead
    @YannMetalhead Před rokem +1

    Good video, thank you!

  • @pewolo
    @pewolo Před rokem +2

    Good video!
    I have one more command in my arsenal.
    But for the files creations, you can easily do that with bash brace expansion. The syntax looks like this:
    touch {1..1000}.txt

  • @childfs6865
    @childfs6865 Před 2 lety

    Thank you!

  • @SylvesterInk
    @SylvesterInk Před 2 lety +4

    Correct me if I'm wrong, but isn't the -exec functionality of find slower because it's executing the command for each individual find result, much like running `xargs -n 1`? I tested the find command using `-exec rm {} \+"`, which appends the results to a single command, and got the same time results as using xarg.
    So if you're using find, it's pretty much comparable to use -exec or xargs interchangeably, for basic tasks, though xargs is obviously more versatile for tasks that aren't related exclusively to the results of find.

    • @SylvesterInk
      @SylvesterInk Před 2 lety +2

      @Terminalforlife (LL) That's where I went to confirm the use of -exec vs xargs, and it's exactly as I described. (The man file even makes the comparison to xargs for `+`.) I tested the 4 commands myself. find using `;` and `xargs -n 1` have nearly the same execution time. find using `+` and `xargs` also have nearly the same execution time (in fact find is just slightly faster.)
      I'm not trying to say that one method should always be used over the other, as it really depends on the situation. The point is that -exec is not slower than xargs when making an equivalent comparison.

  • @wusticality
    @wusticality Před 2 lety

    Thanks for this

  • @portlyoldman
    @portlyoldman Před 2 lety

    Drove my Alexa totally mad! I thought having the wake up word as Echo was a good idea 🥺

  • @archsapostle1stapostleofth738

    Comment to bring this video to the tops

  • @EscapeePrisoner
    @EscapeePrisoner Před 2 lety

    XXXX is a brand of beer in my country. People use it as standard input ALL THE TIME.

  • @Rmly
    @Rmly Před 2 lety

    Amazing content!

  • @philtoa334
    @philtoa334 Před 2 lety

    Really nice.

  • @kshatriya5
    @kshatriya5 Před rokem

    i love your time cmd very much

  • @sabitkondakc9147
    @sabitkondakc9147 Před 2 lety

    Greate Share! cool expanation, -exec is always a huge mess.

  • @gorsama-2190
    @gorsama-2190 Před 2 lety +2

    Beautiful

  • @The_Penguin_City
    @The_Penguin_City Před 2 lety

    Excelente video, felicidades.

  • @teejaded
    @teejaded Před 2 lety

    Another fun tip for xargs subshells is you can export a function with export -f functionname and call it from the subshell. Makes it easy to write a parallel executed pipeline of bash functions.

    • @aqtmeto
      @aqtmeto Před rokem

      I'm interested in this, can you elaborate? Maybe a quick example, thanks!!

  • @ricknaam5658
    @ricknaam5658 Před 2 lety +4

    I use xargs to push to all git remotes:
    alias gpsa="git remote | xargs -I remotes git push remotes master"

  • @wliaputs
    @wliaputs Před 2 lety

    Wow I wished I took time to learn xargs earlier!

  • @darthcabs
    @darthcabs Před 2 lety

    Superb!

  • @a13xhackintosh
    @a13xhackintosh Před 2 lety

    Clear explianation

  • @MrLeoStief
    @MrLeoStief Před 2 lety +1

    Nice video, but recommending against using `find -exec` doesn't make sense. The reason it took so long is because you instructed it to run 1,000 individual rm commands by putting a semicolon at the end; replace that with a plus sign (or just use the -delete option in this case) and find will bulk delete those files in no time with no need for xargs.

  • @RodrigoPolo
    @RodrigoPolo Před rokem

    ¡THANK YOU!

    • @RodrigoPolo
      @RodrigoPolo Před rokem

      BTW, with ChatGPT I found a couple of interesting commands:
      find "$(pwd)" -type f -iname "*.md" -print0 | xargs -0 grep -l -i "keyword"
      find "$(pwd)" -type f -iname "*.md" -print0 | xargs -0 grep -zi "keyword" --files-with-matches
      and
      find "$(pwd)" -type f -iname "*.md" -print0 | xargs -0 grep -n -H -i "keyword"

  • @tadaoterwiel9656
    @tadaoterwiel9656 Před rokem

    Toinen hieno video DT

  • @mubba1992
    @mubba1992 Před 2 lety

    I Love it!!!

  • @ozzman530
    @ozzman530 Před 2 lety

    I use -a option to read from a file of hosts, and xargs can ping every host in the file. Using the -P option lets me ping multiple hosts at a time, and I can find the status of hundreds of hosts in a matter of seconds using ping. Good for identifying network problems.

  • @bitti1975
    @bitti1975 Před 2 lety

    Nice, learned a few new things. Regarding 'printf': it's not the quotes wich where missing, but that the first argument of printf should be a format string (e.g. "%s " to get the same behaviour as 'echo'). Regarding 'find' --exec: 'rm' isn't the best example here, since 'find' has a '-delete' flag which does the same but as fast (or faster) as your xargs solution. But I can see how this trick can be useful in general.
    Another thing which might have been nice to show: I often use xargs without any input pipe, so it just takes input from stdin which I find useful if I just want to process a list I've in my clipboard.

  • @archishabanerjee9418
    @archishabanerjee9418 Před 2 lety

    Hey! This was very helpful, lucid and comprehensive.
    I wanted to ask .. how do we set the time taken to be displayed once a process is executed - Like it showed " took 5s" for you. Please do make a video for the same.
    Thanks in advance!

  • @dvr2alarm
    @dvr2alarm Před 2 lety

    a count of processes in "-P" would keep the system responsive to other commands and functions. usually a quarter of the "ulimit -u"

  • @aacolive
    @aacolive Před 2 lety

    7:22 Oh my poor inode hehe

  • @_yuri
    @_yuri Před 2 lety +1

    thAnks dt

  • @greenmanreddog
    @greenmanreddog Před 2 lety +1

    I'm sure 'time' measures the execution time of only the find command, this includes the file deletion with -exec, but not with |xargs, so is this a fair comparison?

  • @Cyborg9799
    @Cyborg9799 Před 2 lety

    Thanks I have been using exec forever. As you said it works but the timing shows xargs is more efficient.

    • @dapodix
      @dapodix Před rokem

      find -exec ... {} + makes it faster and safer than piping to xargs.. As opposed to find -exec ... {} \; which loops through each arg instead of processing multiple args at a time.

  • @preetham524
    @preetham524 Před 2 lety +1

    please do a tutorial on shell expansion

  • @pushkarmadan5455
    @pushkarmadan5455 Před 2 lety

    Although I know a bash substitutes for some of the things shown in video there is no harm learning new methods of doing things.

  • @MrSasukeUchihaEMS
    @MrSasukeUchihaEMS Před 2 lety +1

    thaaaaaaaaaanks

  • @shinbart7554
    @shinbart7554 Před 2 lety

    Thanks for video so helpful to me (a beginner for linux)
    BTW what's going on with caption it's set to Vietnamese

  • @duality4y
    @duality4y Před 2 lety

    xargs is awesome :)

  • @linjunhong2005
    @linjunhong2005 Před 2 lety

    I will never write a for loop since I know 'xargs -n 1 -I {}' thanks a lot sir.

  • @volodymyrsen
    @volodymyrsen Před 2 lety

    How did you implement the "~/ took {time} >" in your command line?

  • @rdg8268
    @rdg8268 Před 2 lety

    Can I use xargs with cut command through a comma delimited file, and pass each position as next command arguments?