이 질문은 이전 질문에 대한 후속 질문입니다.다음을 사용하여 많은 수의 디렉토리를 생성하십시오.mkdir
.
쉘을 사용하고 있습니다 bash
. 다음 명령을 사용하여 각각 접두사 "s"로 시작하는 50개의 디렉터리를 만들었습니다.
mkdir $(printf "s%02i " $(seq 1 50))
두 번째 숫자까지 0으로 채웁니다. 즉, 제가 얻은 디렉토리는 s01
, s02
, ..., s49
, 의 형태입니다 s50
.
이제 cp
. test.txt
위의 방법과 비슷하게 하면 되나요? 예를 들어, 다음이 작동할까요? 저는 Unix/Linux에 비교적 익숙하지 않기 때문에 누군가가 안전하다고 말하기 전까지는 이 방법을 시도하고 싶지 않습니다.
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.
답변1
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
실행하기 전에 실행할 내용을 확인하려면 명령 앞에 this 를 추가하면 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
명령의 출력을 사용하여 파일을 각 디렉터리에 복사하려면 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
.
답변3
이에 따르면:https://stackoverflow.com/questions/195655/how-to-copy-a-file-to-multiple-directories-using-the-gnu-cp-command파일을 여러 대상에 복사할 수 없습니다. 이 작업을 수행하는 다른 방법을 보여주므로 링크를 확인하세요.
답변4
GNU를 사용할 수도 있습니다평행선. 현재 text.txt가 포함된 디렉토리에 있고 50개의 디렉토리 /my/50dirs/path
(예: /my/50dirs/path/s01
etc. /my/50dirs/path/s02
)가 있다고 가정하면 다음을 실행합니다.
seq -w 01 50 | parallel -j1 cp text.txt /my/50dirs/path/s{}