명령 셸에서 파일 x 번 복제


22

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

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

5
당신의 유일한 오류는 어디에 있지 않아야하며 echo, $1어느 것이 있어야 $i합니까?
Julie Pelletier

에코를 제거하고 사용 test$1.ogg하면 test.ogg와 test.ogg는 같은 파일 이므로 $ 1이 인식되지 않는 것 같습니다.
Black

@EdwardBlack : 요구 사항을 잘못 이해 한 것 같습니다. 그 해결책은 적합하지 않습니다.
cuonglm

@JuliePelletier, 젠장, 가끔 우연히 $1대신에 글을 쓰는 $i경우가 있습니다. 아침에 이른 것입니다. 죄송합니다 ... 감사합니다. 나는 $x대신 미래에 사용할 것이다$i
Black

답변:


25

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

  1. echo없을 것이다.
  2. 대상 파일 이름에서와 $i같이 변수 가 잘못 입력되었습니다 $1.

파일 자체와 동일한 디렉토리에 파일 사본을 만들려면

cp thefile thecopy

예를 들어 다른 것을 삽입하면

cp thefile theotherthing thecopy

다음은 당신이 복사 할 것으로 가정 thefile하고 theotherthing디렉토리 라고합니다 thecopy.

귀하의 경우에는 특별히이라는 파일 test.oggecho디렉토리에 복사 할 파일을 찾습니다 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 개 사본에 대해서는 가능하지만 수천 장에 대해서는 "인수 목록이 너무 깁니다"오류가 발생할 수 있습니다. 이 경우 루프 사용으로 되돌립니다.


12

짧고 정확한

< 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

3
이는 여러 번의 호출보다 속도가 빠르지 만 cp(사용 가능한 메모리에 상대적인 파일 크기에 따라 다름) 파일 메타 데이터를 보존하지 못하는 결함이 있습니다.
Gilles 'SO- 악마 그만'

오 @Gilles, 우리는 그것을 극복 할 수 있는가?
라훌

3
cp --attributes-only나중에 달릴 수 있습니다 .
Gilles 'SO- 악마 그만해'

@Gilles의 덕분에, 당신의 도움에 따라 내 대답을 업데이트했습니다.
라훌

FWIW cp -p메타 데이터를 보존 하는 데 사용 된 다른 답변 은 없습니다.
roaima

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

1
변수 확장은 인용되어야한다.
고양이

1

다음 명령은 파일을 5 번 복사합니다 .

$ seq 5 | xargs -I AA cp file.a fileAA.a

dd를 선호하는 경우 (cp와 동일하지 않음) :

$ seq 5 | xargs -I AA dd if=file.a of=fileAA.a

0

복사하는 동안 변수 i를 호출하지 않았습니다

아래 스크립트를 사용하십시오. 테스트 한 결과 제대로 작동했습니다.

for i in {1..10}; do cp -rvfp test.ogg test$i.ogg ;done

3
이것은 (1) 질문에 약 100이 묻고 답변이 10을 사용하고 (2) -rvf옵션을 불필요하게 옵션에 추가했으며 cp(3) 변수 확장을 인용하지 않았다는 점을 제외하고는 이전의 두 답변과 주석과 동일합니다. . (또한 구두점 기호와 ;다음 단어 사이에 공백을 두는 것이 일반적 입니다.) -p옵션을 추가하는 것은 가치가 있지만 (4a) 이미 (주석으로) 처리되었으며 (4b) 귀하의 답변은 그렇지 않습니다 하고있는 일을 설명하지 않으면 도움이됩니다.
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.