Разве ваша единственная ошибка не в том, echoчего не должно быть, и в том, $1что должно быть $i?
Джули Пеллетье
если я удаляю echo и использую только test$1.oggтогда, он говорит: test.ogg и test.ogg - это одни и те же файлы , поэтому кажется, что $ 1 не распознается?
Черный
@ EdwardBlack: Похоже, я неправильно понял ваши требования. Это решение не подходит.
cuonglm
@JuliePelletier, чёрт, иногда мне случается так, что я пишу случайно, $1а $iне раннее утро, извините ... спасибо. Я буду использовать $xв будущем вместо$i
Black
Ответы:
25
У вашего шелл-кода есть две проблемы:
Там echoне должно быть.
Переменная $iвводится с ошибкой, как $1в имени файла назначения.
Чтобы сделать копию файла в том же каталоге, что и сам файл, используйте
cp thefile thecopy
Если вы вставите что-нибудь еще туда, например
cp thefile theotherthing thecopy
тогда предполагается, что вы хотите скопировать thefileи theotherthingв каталог с именем thecopy.
В вашем случае он специально ищет файл с именем test.oggи именем, который echoнужно скопировать в каталог test$1.ogg.
$1, Скорее всего , расширится к пустой строке. Вот почему, когда вы удаляете команду echoиз команды, вы получаете «test.ogg и test.ogg - это одни и те же файлы»; выполняемая команда по существу
Примечание. Скорее всего, это будет работать для 100 копий, но для тысяч копий может привести к ошибке «список аргументов слишком длинный». В этом случае вернитесь к использованию цикла.
как предлагает @Gilles, использование teeимеет дефект в том, что не сохраняет метаданные файла. Чтобы преодолеть эту проблему, вам может потребоваться выполнить команду ниже после этого:
Это потенциально быстрее, чем множественные вызовы cp(зависит от размера файла относительно доступной памяти), но имеет недостаток - не сохранять метаданные файла.
Жиль "ТАК ... перестать быть злым"
@ Жиль, мы можем это преодолеть?
Рахул
3
Вы можете запустить cp --attributes-onlyпотом.
Жиль "ТАК - перестань быть злым"
@ Жиль спасибо, обновил мой ответ в соответствии с вашей помощью.
Рахул
FWIW ни один из других ответов также не использовался cp -pдля сохранения метаданных.
roaima
11
for i in{1..100};do cp test.ogg "test_$i.ogg";done
Это то же самое, что два предыдущих ответа и комментарий, за исключением (1) вопрос задает около 100, а в вашем ответе используется 10, (2) вы излишне добавили -rvfопции cp, и (3) вы не в кавычках указали расширение переменной , (Также обратите внимание, что принято ставить пробел между символами пунктуации, такими как ;и следующее слово.) Добавление -pопции является полезным, но (4a) он уже был рассмотрен (в комментариях), а (4b) ваш ответ не является полезно, если вы не объясняете, что делаете.
echo
чего не должно быть, и в том,$1
что должно быть$i
?test$1.ogg
тогда, он говорит: test.ogg и test.ogg - это одни и те же файлы , поэтому кажется, что $ 1 не распознается?$1
а$i
не раннее утро, извините ... спасибо. Я буду использовать$x
в будущем вместо$i
Ответы:
У вашего шелл-кода есть две проблемы:
echo
не должно быть.$i
вводится с ошибкой, как$1
в имени файла назначения.Чтобы сделать копию файла в том же каталоге, что и сам файл, используйте
Если вы вставите что-нибудь еще туда, например
тогда предполагается, что вы хотите скопировать
thefile
иtheotherthing
в каталог с именемthecopy
.В вашем случае он специально ищет файл с именем
test.ogg
и именем, которыйecho
нужно скопировать в каталогtest$1.ogg
.$1
, Скорее всего , расширится к пустой строке. Вот почему, когда вы удаляете командуecho
из команды, вы получаете «test.ogg и test.ogg - это одни и те же файлы»; выполняемая команда по существуЭто, вероятно, опечатка.
В конце концов, вы хотите что-то вроде этого:
Или, как альтернатива
Или, используя
tee
:Примечание. Скорее всего, это будет работать для 100 копий, но для тысяч копий может привести к ошибке «список аргументов слишком длинный». В этом случае вернитесь к использованию цикла.
источник
Коротко и точно
или даже лучше сделать
см. использование команды tee для получения дополнительной помощи.
Обновить
как предлагает @Gilles, использование
tee
имеет дефект в том, что не сохраняет метаданные файла. Чтобы преодолеть эту проблему, вам может потребоваться выполнить команду ниже после этого:источник
cp
(зависит от размера файла относительно доступной памяти), но имеет недостаток - не сохранять метаданные файла.cp --attributes-only
потом.cp -p
для сохранения метаданных.источник
Следующая команда скопирует file.a 5 раз:
Если вы предпочитаете dd (не то же самое, что cp!):
источник
Вы не вызвали переменную I во время копирования
используйте скрипт ниже. Как проверено это работало нормально
источник
-rvf
опцииcp
, и (3) вы не в кавычках указали расширение переменной , (Также обратите внимание, что принято ставить пробел между символами пунктуации, такими как;
и следующее слово.) Добавление-p
опции является полезным, но (4a) он уже был рассмотрен (в комментариях), а (4b) ваш ответ не является полезно, если вы не объясняете, что делаете.