dired-do-shell-command
(bound to !
in dired
) can
handle multiple marked files in a few different ways. They are quite
intuitive but I always wished for a cheatsheet with all the options,
so here I am, creating one.
implicit file | single file | multiple files | |
---|---|---|---|
foreground | cat |
cat foo ? bar |
cat foo * bar |
background parallel | cat & |
cat foo ? bar & |
cat foo * bar & |
background sequential | cat ; |
cat foo ? bar ; |
cat foo * bar ; |
Read further for a little more detailed explanation of each option.
Implicit file argument
Foreground
cat
for file in "${marks[@]}"; do
cat "$file"
done
Background parallel
cat &
for file in "${marks[@]}"; do
cat "$file" &
done
Background sequential
cat ;
cat ;&
for file in "${marks[@]}"; do
cat "$file"
done &
Single file per command
Foreground
cat foo ? bar
for file in "${marks[@]}"; do
cat foo "$file" bar
done
Use `?`
to use a filename as a part of a longer argument:
cat foo`?`bar
for file in "${marks[@]}"; do
cat "foo${file}bar"
done
Background parallel
cat foo ? bar &
for file in "${marks[@]}"; do
cat foo "$file" bar &
done
Background sequential
cat foo ? bar ;
cat foo ? bar ;&
for file in "${marks[@]}"; do
cat foo "$file" bar
done &
All files in a single command
Foreground
cat foo * bar
cat foo "${marks[@]}" bar
Use *""
to pass an explicit *
to the shell (globbing):
cat foo * bar *""
cat foo "${marks[@]}" bar *
Background parallel
cat foo * bar &
cat foo "${marks[@]}" bar &
Background sequential
cat foo * bar ;
cat foo * bar ;&
The same behavior as the parallel call when *
is in use.