for 루프를 사용하여 명령줄에서 비디오 파일을 x번 복사하려고 합니다. 다음과 같은 것을 시도했지만 작동하지 않습니다.
for i in {1..100}; do cp test.ogg echo "test$1.ogg"; done
답변1
쉘 코드에는 두 가지 문제가 있습니다.
echo
거기 있어서는 안됩니다 .- 대상 파일 이름의 변수
$i
("dollar i")가 ("dollar one")로 잘못 입력되었습니다.$1
파일 자체와 동일한 디렉터리에 파일 복사본을 만들려면 다음을 사용하세요.
cp thefile thecopy
다음과 같이 두 개 이상의 매개변수를 사용하는 경우
cp thefile theotherthing thecopy
그렇다면 그것은추정thefile
복사 해서 theotherthing
입력하고 싶나요?목차부르다 thecopy
.
귀하의 경우에는 cp test.ogg echo "test$1.ogg"
구체적으로 이름이 지정된 파일을 찾고 test.ogg
이름이 지정된 파일을 echo
디렉터리에 복사합니다 test$1.ogg
.
$1
빈 문자열로 확장될 가능성이 높습니다 . 그렇기 때문에 echo
명령에서 제거하면 "test.ogg와 test.ogg는 동일한 파일입니다"라는 메시지가 표시됩니다. 실행되는 명령은 본질적으로입니다.
cp test.ogg test.ogg
이는 잘못된 입력일 가능성이 높습니다.
마지막으로 다음과 같은 것을 원합니다.
for i in {1..100}; do cp test.ogg "test$i.ogg"; done
아니면 대안으로
i=0
while (( i++ < 100 )); do
cp test.ogg "test$i.ogg"
done
또는 다음을 사용하십시오 tee
.
tee test{1..100}.ogg <test.ogg >/dev/null
참고: 이는 100개의 복제본에 대해 작동할 가능성이 높지만 수천 개의 복제본에 대해서는 "매개변수 목록이 너무 김" 오류가 생성될 수 있습니다. 이 경우 루프 사용으로 되돌리세요.
답변2
for i in {1..100}; do cp test.ogg "test_$i.ogg" ; done
답변3
짧고 정확하다
< test.ogg tee test{1..100}.ogg
아니면 아직 더 나은
tee test{1..100}.ogg < test.ogg >/dev/null
바라보다tee 명령 사용법더 많은 도움을 요청하세요.
고쳐 쓰다
@Gilles가 제안한 것처럼 사용에는 tee
파일 메타데이터가 보존되지 않는다는 단점이 있습니다. 문제를 해결하려면 이 후에 다음 명령을 실행해야 할 수도 있습니다.
cp --attributes-only --preserve Source Target
답변4
복사할 때 변수 i를 호출하지 않습니다.
아래 스크립트를 사용하세요. 테스트 후 효과는 매우 좋습니다
for i in {1..10}; do cp -rvfp test.ogg test$i.ogg ;done