복사하는 동안 파일 이름을 바꾸는 방법?


12

이름에서 임의의 문자열 부분을 제거하기 위해 각 파일의 이름을 바꾸는 동안 백업 디렉토리의 모든 파일을 사용자 디렉토리로 복사하는 방법 (날짜가 변경되지 않는 아카이브 스타일) (예 : -2b0fd460_1426b77b1ee_-7b8e)?

cp from :

/backup/path/data/Erp.2014.02.16_16.57.03-2b0fd460_1426b77b1ee_-7b8e.etf

에:

/home/user/data/Erp.2014.02.16_16.57.03.etf

각 파일은 항상 "Erp"로 시작합니다. 날짜-시간 스탬프 문자열 다음에 임의 문자열과 확장자 ".etf"가옵니다. 날짜-시간 스탬프를 포함한 모든 이름 요소를 유지하고 싶습니다. 임의의 문자열을 제거하고 싶습니다.

임의 문자열은 동일한 파일의 여러 백업을 허용합니다. 그러나이 경우 방금 fdupes를 실행했으며 복제본이 없습니다. 임의의 문자열을 제거하여 모든 파일을 간단히 복원 할 수 있습니다.

한 줄 bash 명령을 찾고 있습니다.

그래도 작동하지 않으면 두 단계 이상으로 수행 할 수 있습니다. 나는 보통 KRename을 사용하지만이 경우에는 bash에서해야합니다. (저는 원격으로 일하고 있습니다.)

답변:


7

pax한 번에이 작업을 수행 할 수 있습니다. 당신은 할 수 있습니다 :

cd /backup/path/data && pax -wrs'/-.*$/.etf/' Erp*etf /home/user/data

pax기본적으로 시간 -pe을 유지 하지만 모든 것을 -pp유지 하거나 (루트로 가장 잘 수행됨) 권한을 유지 하기 위해 추가 할 수 있습니다 ( 예 :

cd /backup/path/data && pax -wrs'/-.*$/.etf/' -pe Erp*etf /home/user/data

그렇지 않으면 ( pax일반적으로 기본적으로 사용 가능하지 않음) 반드시 다음을 복사하는 것이 좋습니다 rename.

cp -a /backup/path/data/Erp*.etf /home/user/data
rename 's/-.*$/.etf/' /home/user/data/Erp*.etf

이 방법으로 각 파일마다 다른 프로세스가 시작되지 않습니다.


1
에 익숙해 져야한다는 것을 알 수 있습니다 pax. 이것은 매우 유용한 도구처럼 보입니다. 왜 더 많은 배포판에서 표준이 아닌지 궁금해합니다.
MountainX

위키피디아에 따르면 @MountainX, 좋은 질문 pax은 2005 년 이래 Linux Standard Base에있었습니다. 또한 GNU 대안 cpio은 아마도 가장 기능이 적은 GNU 도구 일 것입니다.
Graeme

1
마지막 솔루션의 경우 +1이며, 이렇게하면 각 파일마다 다른 프로세스가 시작되지 않습니다. 그러나 rename Fedora / Red Hat과는 다릅니다 :이 경우에 그것을 사용하는 방법을 모르겠습니다.
erik

15

옵션 cp과 함께 명령을 사용할 수 있습니다-a

-a, --archive
       same as -dR --preserve=all

그런 다음 for 루프를 사용하여 복사하는 동안 모든 파일의 이름을 바꾸십시오.

for file in Erp*etf; do
  cp -a $file destinationDirectory/${file%%-*}.etf
done

준비된. 소스 디렉토리에서이 명령을 시작하십시오.

설명 : (가) %%-*하이픈의 선두로부터 후 모든 문자를 차단합니다 / 마이너스 -.etf끝에 다시 파일 확장자를 추가합니다.

글쎄, 그리고 하나의 라이너로 모든 것을 한 줄에 넣으십시오. :-) 이것처럼

for file in Erp*etf; do cp -a $file destinationDirectory/${file%%-*}.etf; done

1
감사합니다. %%-*팁에 대한 문서를 인용 해 주 시겠습니까? 궁금해.
soyuka

3

zsh에서는을 사용하십시오 zmv. 이것을 당신의 것으로 넣으십시오 .zshrc:

autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'

그런 다음 사용

zcp '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

bash에서 :

zsh -c 'autoload zmv; zmv -C $0 $1' '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

zsh가없는 경우 POSIX 방식 은 pax (디렉토리를 재귀 적으로 복사 함)를 사용합니다.

zsh가없고 pax가없는 제한된 시스템 인 경우 루프를 사용할 수 있습니다.

for source in /backup/path/data/*-*.etf; do
  basename=${source##*/}
  cp "$source" "/home/user/data/${basename%-*}.${basename##*.}"
done

1

cp그 능력이 없습니다. 나는 cpio그렇게 할 수 있다고 생각하지만 현재 맨 페이지는 그렇지 않다고 말합니다. 그러나 (gnu) tar에는 다음과 같은 --transform옵션이 있습니다.

 --transform, --xform EXPRESSION
       use sed replace EXPRESSION to transform file names

따라서 다음과 같은 cmdline이 있습니다.

(cd /backup/path/data; tar --create --transform 's/-.*-....//' .) | (cd /home/user/data; tar --extract)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.