Работа с именами файлов, начинающимися с тире ("-") при использовании `-exec` и `xargs`

Тут руками не сложно:

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
2
03.10.2019, 22:35
2 ответа

Похоже, это 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вернет имя файла с префиксом ./.

4
27.01.2020, 21:51

Опция -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вы также можете использовать его expression -на основе oквалификатора rdering glob:

cp -v -- *.jpg(oe['REPLY=$RANDOM'][1,8]) target/

Это имеет преимущество перед shufподходом к работе на любой системе, (при условии, что zshустановлена; вам может потребоваться отказаться от нестандартного --vв некоторых системах ), а также продолжать работать, даже если в текущем каталоге (есть два множества jpgфайлов и выполнение shufбудет сбой с ошибкой Слишком много аргументов ).

3
27.01.2020, 21:51

Теги

Похожие вопросы