cp 명령을 사용하여 여러 파일을 복사하는 경우 복사하는 동안 파일 이름을 바꿀 수 있나요? [폐쇄]

cp 명령을 사용하여 여러 파일을 복사하는 경우 복사하는 동안 파일 이름을 바꿀 수 있나요? [폐쇄]

이것이 사실인지 거짓인지 알고 싶습니다.

답변1

cp단일 파일을 다른 파일 이름(예: "이름 바꾸기" 대상)으로 복사할 수 있지만 여러 파일에 다른 파일 이름을 지정할 수는 없습니다. 따라서 대답은 '아니요'입니다. cp여러 파일을 복사할 때 이름을 바꿀 수 없습니다.

2개 이상의 인수가 주어 지면 cp모든 파일은 마지막 인수(디렉토리)에 복사됩니다. 예를 들어cp file1 file2 file3 /path/to/destdir/

GNU에는 소스 파일 앞에 대상을 지정할 수 있는 또는 옵션이 cp있습니다 . 예를 들어-t--target-directorycp -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즐겨 사용하는 텍스트 편집기로 편집하고 newfilecp명령줄에서 복사된 파일의 이름을 바꾸려는 이름으로 변경합니다. 일부 파일의 이름을 바꾸지 않으려면 newfile대상 위치에서 해당 파일을 삭제하고 경로만 대상 위치로 유지하세요.

'./foo'bar.txt'소스 파일 이름 으로 출력의 마지막 줄을 참고하십시오 . 파일 이름에 문자가 포함되어 있으므로 해당 줄 은 다음과 같이 포함 되도록 '변경하기 위해 추가 편집이 필요합니다 .''\''

cp './foo'\''bar.txt' '/path/to/dest/newfile'

sed또는 GNU (NUL 줄로 구분 또는 옵션 사용) 가 있는 경우 다음을 -z사용하여 이를 자동화할 수 있습니다.--null-dataxargs

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.txttarget/foo-2016.txt

관련 정보