cp를 사용하여 단일 파일을 여러 디렉토리로 복사


12

이 질문은 이전 질문 인을 사용하여 수많은 디렉토리를 만드는mkdir 일련의 속편입니다 .

bash쉘을 사용하고 있습니다. 다음 명령을 사용하여 접두사 "s"로 시작하는 50 개의 디렉토리를 만들었습니다.

mkdir $(printf "s%02i " $(seq 1 50))

두 번째 숫자는 0으로 채워집니다. 즉, 내가 얻으 디렉토리의 형식은 s01, s02..., s49, s50.

이제 cp단일 파일 (예 test.txt:)을 50 개 디렉토리 각각에 복사하는 데 사용 하고 싶습니다 . 위와 비슷한 방법으로 이것을 할 수 있습니까? 예를 들어 다음과 같이 작동합니까? 나는 유닉스 / 리눅스를 처음 접하기 때문에 누군가 안전한지 알려주기 전까지는 이것을 시도하고 싶지 않다.

cp test.txt $ (printf "s % 02i.txt"$ (seq 1 50))

에 대한 man페이지를 cp보면 다음과 같이 cp여러 대상을 지원하는 것처럼 보이지 않습니다 .

NAME
       cp - copy files and directories

SYNOPSIS
       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...

DESCRIPTION
       Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

       Mandatory  arguments  to  long  options are mandatory for short options
       too.

답변:


7

을 사용하여 명령의 출력을 사용하여 파일을 각 디렉토리에 복사하려면 cp항상 다음으로 파이프하십시오 xargs.

printf "s%02i " $(seq 1 50) | xargs -n 1 cp test.txt

미리 형식과 내용을 알고 있기 때문에 출력 구문 분석의 안전성에 대해 걱정할 필요가 없습니다. 파일 이름에서 메타 문자와 공백이 발생할 위험은 실제로 문제가되지 않습니다.

또는 디렉토리가 이미 있다고 가정하면 다음과 같이 시도 할 수 있습니다.

find . -maxdepth 1 -type d -name 's[0-9][0-9]' -print0 | xargs -0 -I {} cp test.txt {}

또는 파이프가없는 경우 :

find . -maxdepth 1 -type d -name 's[0-9][0-9]' -exec cp test.txt {} \;

마지막 두 명령은 현재 디렉토리에서 파일을 찾습니다 cp test.txt. 이 -maxdepth 1옵션은 파일을받는 하위 디렉토리도 피합니다. 다음 두 자리 숫자 's[0-9][0-9]'와 일치 한다는 경고를 s받으십시오. 어떤 이유로 인해 s99에있는 cwd경우의 사본도 받게됩니다 test.txt.


8

쉘이 for루프를 사용 하여 반복을 수행하도록 할 수도 있습니다 . 이것은 parallel또는 xargs과 같은 외부 도구에 의존하지 않는 가장 기본적인 방법이며 이해하기가 가장 쉽습니다.

for name in $(printf "s%02i " $(seq 1 50)); do
    mkdir $name
    cp test.txt $name
done

이것을 작성하는 다른 방법은 백만 가지가 있습니다. 예 :

for name in $(seq -w 1 50); do
    mkdir s$name
    cp test.txt s$name
done

실행하기 전에 실행되는 내용을 확인하려면 명령을 앞에 추가 echo하여 행을 실행하지 않고 인쇄합니다.

for name in $(seq -w 1 50); do
    echo mkdir s$name
    echo cp test.txt s$name
done

출력 :

mkdir s01
cp test.txt s01
mkdir s02
cp test.txt s02
mkdir s03
cp test.txt s03
# etc.


2

GNU parallel을 사용할 수도 있습니다 . text.txt가 포함 된 디렉토리에 있고 50 개의 디렉토리가 /my/50dirs/path(예 /my/50dirs/path/s01: /my/50dirs/path/s02등) 있다고 가정하면 다음을 수행하십시오.

seq -w 01 50 | parallel -j1 cp text.txt /my/50dirs/path/s{}

2
더 나은 것을을 parallel -j1, 그렇지 않으면 거기에 코어 당 하나의 작업이 될 것이며, 멀티 코어 시스템에서 작업 IO를 위해 경쟁 할 것이다.
Gilles 'SO- 악마 그만'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.