Тут руками не сложно:
eval "$(date +'y=%Y m=%m')"
m=$((${m#0} - 9)) # need to strip the 0 for shells like bash or some
# ash derivatives (but not ksh) that complain
# about an invalid 09 octal number in arithmetic
# expressions. Some date implementations support
# date +%-m, but that's not standard.
if [ "$m" -le 0 ]; then
m=$((m + 12)) y=$((y - 1))
fi
if [ "$m" -lt 10 ]; then
m=0$m # 0-pad single-digit numbers
fi
sed "1s/$/MHHHRGFILE $y${m}01 99991231/" < file > newfile
Похоже, это shuf
, а не cp
, который борется с именами файлов, начинающимися с дефиса. Попробуйте добавить двойное тире -к команде shuf
:
shuf -zn8 -e -- *.jpg | xargs -0I{} cp -vt -- "{}" target/
Я бы использовал для этого find
, а неshuf
:
find. -type f -name '*.jpg' -print0 | xargs -0I{} cp "{}" target/
Кроме того, в этом случае вам не нужно двойное тире -вместо cp
, так как find
вернет имя файла с префиксом ./
.
Опция -t
(расширение GNU )принимает аргумент, который является целевым каталогом.
С помощью xargs -0 cp -vt -- target/
это попытается скопировать target/
и выбранные файлы в каталог с именем --
, и вы все равно не пометите конец опций. Вам также нужно будет отметить конец опций для shuf
.
{}
является специальным только с предикатом find
и -exec
или с xargs
, если вы используете -I'{}'
, но здесь он вам не нужен. shuf
не имеет предиката -exec
.
Вот вам бы:
shuf -zen8 -- *.jpg | xargs -r0 cp -vt target --
Или
shuf -zen8./*.jpg | xargs -r0 cp -vt target
Вместе с zsh
вы также можете использовать его e
xpression -на основе o
квалификатора rdering glob:
cp -v -- *.jpg(oe['REPLY=$RANDOM'][1,8]) target/
Это имеет преимущество перед shuf
подходом к работе на любой системе, (при условии, что zsh
установлена; вам может потребоваться отказаться от нестандартного --v
в некоторых системах ), а также продолжать работать, даже если в текущем каталоге (есть два множества jpg
файлов и выполнение shuf
будет сбой с ошибкой Слишком много аргументов ).