‘Well it’s only passing mv a list of–’ yeah yeah yeah, I know, and that’s why I’m calling bullshit. It should be massively harder to execute filenames. Even if 1970s decisions make that the eternal hideous default: the lack of any idiot-proof standard workaround is incomprehensible.

StackOverflow’s full of competing one-liners and people pointing out how each one is considered harmful. The least-skeezy options use exec. That sentence should make anyone recoil in horror.

This is not a filename problem. This is a tool problem. If a single printable character is going to silently expand into a list of names, then for god’s sake, having it put each name in quotes should be fucking trivial.

  • mindbleachOP
    link
    fedilink
    arrow-up
    1
    ·
    9 months ago

    ls | grep | mv would work, except the StackOverflow discussion also highlights how parsing ls can have the same issues.

    I am moving thousands of files at once. If I have to check each one, it’s still wrong.

    The pragmatic answer turns out to be ./* instead of *.

    • FigMcLargeHuge
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      9 months ago

      I saw that answer and was just offering another option. I am sure xargs might work, but you would need to test as you need a destination passed on each line. Back to my way, I have used it for a lot more than just the move command. I think I used it to do a chmod once where I wanted to check and make sure before I committed to actually running the command(s). You could also use find and the -exec option, which I think was also mentioned here.

      Edit: also, you wouldn’t need to check each one, just the first few and last few to make sure the syntax is correct. Maybe do a wc -l to make sure it’s got the right number of entries and then let it run.