소스 및 대상 값이 포함된 대용량 텍스트 파일에서 파일을 복사하는 방법은 무엇입니까?

소스 및 대상 값이 포함된 대용량 텍스트 파일에서 파일을 복사하는 방법은 무엇입니까?

텍스트 파일에 나열된 모든 파일(약 300만 행, 소스 및 대상 열 2개)을 복사하고 새 파일 이름을 사용하는 스크립트를 작성하려고 합니다.

path/to/source/directory/filename.pdf path/to/destination/directory/Newfilename.pdf
path/to/source/directory/filename2.pdf path/to/destination/directory/Newfilename2.pdf
path/to/source/directory/filename3.pdf path/to/destination/directory/Newfilename3.pdf
...

모든 파일은 PDF 형식이며, 여기서 Newfilename.pdf는 동일한 소스 PDF 파일의 새 파일 이름입니다.

또한 파일을 복사하고 대상 파일 이름에 다음과 같은 정보를 추가하고 싶습니다.

From:
Newfilename.pdf

To:
Newfilename_yyyyMMddHHmmss.pdf (e.g. Newfilename_20200225095823.pdf)

각 파일의 실제 복사 실행 날짜 및 시간은 어디에 있습니까 yyyyMMddHHmmss? 이는 모든 파일에 대해 동일한 형식이므로 대상 파일이 보조 이름을 사용하여 복사됩니다.

path/to/destination/directory/Newfilename_20200225095823.pdf
path/to/destination/directory/Newfilename2_20200225095824.pdf
path/to/destination/directory/Newfilename3_20200225095830.pdf
...

저는 명령을 처리할 지식이 부족합니다. 제가 작업하고 있는 아이디어는 다음과 같습니다.

#!/bin/bash
filename=$1

while read -r source destination; do
# reading each value
cp -p source destination
done < $filename

그러나 비슷한 출판물을 읽은 적이 있습니다.성능을 위해,파일이나 파이프에서 읽을 때 루프와 읽기가 매우 느립니다., 내장된 읽기 셸이 한 번에 한 문자씩 읽기 때문입니다. 인용하다여기.

더 나은 솔루션을 사용하면 어떻게 이를 달성할 수 있습니까?

귀하의 도움에 매우 감사하겠습니다.

답변1

성능 측면을 제외하고 문제의 첫 번째 부분은 bash의 변수 조작 방법을 사용하여 해결할 수 있습니다.

timestamp="$(date +%Y%m%d%H%M%S)"

while read -r source destination; do
  newname="${destination/%.pdf/_$timestamp.pdf}"
  cp -p "$source" "$newname"
done < "$filename"

타임스탬프가 스크립트가 호출된 순간이 아닌 "복사 순간"인 경우 호출은 date루프 내에 배치되어야 합니다.

while read -r source destination; do
  timestamp="$(date +%Y%m%d%H%M%S)"
  newname="${destination/%.pdf/_$timestamp.pdf}"
  cp -p "$source" "$newname"
done < "$filename"

고쳐 쓰다:@Jetchisel이 지적했듯이 bashv4.2부터 command 를 사용하여 날짜 형식을 지정하는 기능이 내장되어 있어 printf외부 명령을 호출할 date필요가 없습니다.

while read -r source destination; do
  printf -v timestamp '%(%Y%m%d%H%M%S)T'
  newname="${destination/%.pdf/_$timestamp.pdf}"
  cp -p "$source" "$newname"
done < "$filename"

관련 정보