명령 셸에서 파일 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.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 개 사본에 대해서는 가능하지만 수천 장에 대해서는 "인수 목록이 너무 깁니다"오류가 발생할 수 있습니다. 이 경우 루프 사용으로 되돌립니다.


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.