이 질문은 이전 질문 인을 사용하여 수많은 디렉토리를 만드는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.
답변
을 사용하여 명령의 출력을 사용하여 파일을 각 디렉토리에 복사하려면 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
.
답변
쉘이 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.
답변
이것에 따르면 : /programming/195655/how-to-copy-a-file-to-multiple-directories-using-the-gnu-cp-command 하나의 파일을 복사 할 수 없습니다 여러 목적지. 다른 방법으로 링크를 확인하십시오.
답변
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{}