‘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.
GenderNeutralBro@lemmy.sdf.org 9 months ago
This is not standard behavior. Got links to StackOverflow?
This works just fine in bash and zsh:
Note that it is recommended to use “./” before a raw * in globs to avoid filenames beginning with “-” being interpreted by the command as special arguments (this is not necessary in the above example, but it is a good habit). See dwheeler.com/essays/filenames-in-shell.html#globb… for more info. e.g.:
This is effectively what happens, except that it’s actually more robust than that, since it also accounts for names with quotes and other special characters. Glob expansion does NOT output file names into the shell; it passes them as arguments to the command with no further shell processing. Arguments can contain any special characters.
Not sure why you’re seeing this behavior. Are you doing something with these file names before passing them to
mv
? Storing them in variables? Saving them to files?mindbleach@sh.itjust.works 9 months ago
It’s literally just
mv *.jpg /mnt/Example/Pictures
.Multiple StackOverflow answers take this as read.
mv ./*.jpg /mnt/Example/Pictures
works fine, though, so thank you for the practical solution. I’m still disgusted there’s any filename that gets treated as… not a filename. That broken stair might be older than I am.GenderNeutralBro@lemmy.sdf.org 9 months ago
Ahhh. That’s a confusing thread, with a couple confounding factors.
The OP in that thread is attempting to a batch rename, which is out of scope of the
mv
command.If you are NOT trying to change the name of the file, I recommend always making the last argument of
mv
your destination directory, rather than the destination file. This is strictly mandatory if you are moving multiple files.OP in that SO thread used the filename as the destination path — a filename which did not exist, and therefore could not be resolved by the wildcard. And if it had existed, the move would have failed. Because of that,
mv /data/*/Sample_*/logs/*_Data_time.err /data/*/Sample_*/logs/*_Data_time_orig.err
is not a valid command.OP cannot accomplish what they want with a single
mv
command. They would need to use a loop or something likefind
.I agree that the lack of universal consistency in how commands handle arguments is unfortunate. There’s no way around that without reinventing the entire OS. Many commands let you pass ‘–’ as an argument to signify that any subsequent arguments should not be interpreted as options even if they begin with ‘-’. But that’s entirely up to the implementation of each program; it’s not a shell feature.
Future OS designers: consider typed arguments. Abandon all legacy cruft.
NeatNit@discuss.tchncs.de 9 months ago
Jackpot! I think! Based on OP’s reply to me, this is almost definitely the real problem: