![cp 명령을 사용하여 여러 파일을 복사하는 경우 복사하는 동안 파일 이름을 바꿀 수 있나요? [폐쇄]](https://linux55.com/image/85407/cp%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%97%AC%EB%9F%AC%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EB%B3%B5%EC%82%AC%ED%95%98%EB%8A%94%20%EA%B2%BD%EC%9A%B0%20%EB%B3%B5%EC%82%AC%ED%95%98%EB%8A%94%20%EB%8F%99%EC%95%88%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EB%B0%94%EA%BF%80%20%EC%88%98%20%EC%9E%88%EB%82%98%EC%9A%94%3F%20%5B%ED%8F%90%EC%87%84%5D.png)
이것이 사실인지 거짓인지 알고 싶습니다.
답변1
cp
단일 파일을 다른 파일 이름(예: "이름 바꾸기" 대상)으로 복사할 수 있지만 여러 파일에 다른 파일 이름을 지정할 수는 없습니다. 따라서 대답은 '아니요'입니다. cp
여러 파일을 복사할 때 이름을 바꿀 수 없습니다.
2개 이상의 인수가 주어 지면 cp
모든 파일은 마지막 인수(디렉토리)에 복사됩니다. 예를 들어cp file1 file2 file3 /path/to/destdir/
GNU에는 소스 파일 앞에 대상을 지정할 수 있는 또는 옵션이 cp
있습니다 . 예를 들어-t
--target-directory
cp -t /path/to/destdir/ file1 file2 file3
-t
... | xargs cp -t destdir/
예를 들어 또는 와 함께 사용할 때 특히 유용합니다 find ... -exec cp -t destdir/ {} +
.
동일한 일명 옵션을 포함 mv
하고 있는 다른 GNU 도구 도 있습니다 .ln
-t
--target-directory
여러 파일을 복사하면서 이름을 바꾸려는 경우 가장 쉬운 방법은 이를 수행하는 스크립트를 작성하는 것입니다.
대부분의 스크립트는 자동으로 생성할 수 있습니다. 이를 수행하는 방법은 여러 가지가 있습니다. 이는 가장 간단한 방법 중 하나입니다(파일 이름 일치를 *.txt
예로 들어 보겠습니다).
find . -maxdepth 1 -name '*.txt' \
-exec echo cp \'{}\' \'/path/to/dest/newfile\' \; > mycp.sh
( file
가로 스크롤 막대를 피하기 위해 명령을 두 줄로 나누었지만 한 줄에 모두 입력할 수 있습니다.)
그러면 다음과 같은 출력이 생성됩니다.
$ ls -1 *.txt
dict.txt
qstat.txt
x.txt
foo'bar.txt
$ find . . -maxdepth 1 -name '*.txt' \
-exec echo cp \'{}\' \'/path/to/dest/newfile\' \;
cp './qstat.txt' '/path/to/dest/newfile'
cp './x.txt' '/path/to/dest/newfile'
cp './dict.txt' '/path/to/dest/newfile'
cp './foo'bar.txt' '/path/to/dest/newfile'
그런 다음 mycp.sh
즐겨 사용하는 텍스트 편집기로 편집하고 newfile
각 cp
명령줄에서 복사된 파일의 이름을 바꾸려는 이름으로 변경합니다. 일부 파일의 이름을 바꾸지 않으려면 newfile
대상 위치에서 해당 파일을 삭제하고 경로만 대상 위치로 유지하세요.
'./foo'bar.txt'
소스 파일 이름 으로 출력의 마지막 줄을 참고하십시오 . 파일 이름에 문자가 포함되어 있으므로 해당 줄 은 다음과 같이 포함 되도록 '
변경하기 위해 추가 편집이 필요합니다 .'
'\''
cp './foo'\''bar.txt' '/path/to/dest/newfile'
sed
또는 GNU (NUL 줄로 구분 또는 옵션 사용) 가 있는 경우 다음을 -z
사용하여 이를 자동화할 수 있습니다.--null-data
xargs
find . -maxdepth 1 -name '*.txt' -print0 |
sed -z -e "s/'/'\\\''/g" |
xargs -0 -r -i echo cp \'{}\' \'/path/to/dest/newfile\' > mycp.sh
스크립트 편집이 완료되면 를 사용하여 실행할 수 있습니다 sh mycp.sh
.
답변2
아니요, cp
복사하는 파일의 이름은 변경되지 않습니다. 각 파일을 대상 디렉터리의 동일한 기본 이름을 가진 파일에 복사합니다. 파일 이름이 변경되는 유일한 경우 cp
는 단일 파일을 복사하고 디렉터리 대신 전체 이름을 대상으로 지정할 때입니다.
일부 버전에서는 cp
이미 존재하는 대상 파일(있는 경우)의 이름을 바꿀 수 있습니다.
복사하는 동안 파일 이름을 바꾸려면 다음을 사용할 수 있습니다.pax
. 디렉토리 트리를 복사하거나 아카이브를 생성하거나 압축을 풀기 위한 유틸리티입니다. POSIX 시스템의 필수 유틸리티이지만 일부 Linux 배포판에서는 기본적으로 설치하지 않습니다(패키지로 사용할 수 있음). pax를 사용하면 sed 스타일 지시문을 적용하여 파일 이름을 바꿀 수 있습니다.s/REGEX/REPLACEMENT/
pax -rw -pe -s/2015/2016/ source/ target/
source/foo-2014.txt
및 파일을 및 source/2015.txt
에 복사합니다 .target/foo-2014.txt
target/foo-2016.txt