this post was submitted on 20 Feb 2024
-1 points (46.2% liked)

Linux

2415 readers
35 users here now

Shit, just linux.

Use this community for anything related to linux for now, if it gets too huge maybe there will be some sort of meme/gaming/shitpost spinoff. Currently though… go nuts

founded 2 years ago
MODERATORS
 

'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.

you are viewing a single comment's thread
view the rest of the comments
[–] FigMcLargeHuge 1 points 9 months ago (1 children)

When I run into situations like this, I use the commands that work to write out a script. Eg, in your case the wildcard isn't working with the mv command, so do something like this:

ls -1 *.jpg | awk '{print "mv ""$1"" /mnt/example/Pictures"}' > /tmp/movefiles.sh

Then check the movefiles.sh and make sure it has all of the commands and files properly stated, make that executable, and then run that.

[–] mindbleach 1 points 9 months ago (1 children)

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 1 points 9 months ago* (last edited 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.