명령 셸에서 파일을 x번 반복합니다.

명령 셸에서 파일을 x번 반복합니다.

for 루프를 사용하여 명령줄에서 비디오 파일을 x번 복사하려고 합니다. 다음과 같은 것을 시도했지만 작동하지 않습니다.

for i in {1..100}; do cp test.ogg echo "test$1.ogg"; done

답변1

쉘 코드에는 두 가지 문제가 있습니다.

  1. echo거기 있어서는 안됩니다 .
  2. 대상 파일 이름의 변수 $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

관련 정보