복잡한 파일 복사 및 이름 바꾸기

복잡한 파일 복사 및 이름 바꾸기

특정 디렉토리에 많은 파일이 있습니다. 예를 들어:

  • 디렉토리가 있습니다: /home/scrivania/pdb_files내용:
    UN4_A.pdb
    VIV_A.pdb
    XMG_A.pdb
    Z34_A.pdb
    ZAR_A.pdb
    ZTW_B.pdb
    
  • 게다가 file() 에는 다음과 같은 객체 목록이 있습니다 "list.txt".
    VIV
    XMG
    ZTW
    

/home/scrivania/news/나는 단지 작업 디렉토리에서 다른 디렉토리로 파일에 존재하는 파일을 복사하고 싶습니다 "list.txt".

디렉토리 끝에는 news다음 3개 파일만 필요합니다.

VIV_A.pdb
XMG_A.pdb
ZTW_B.pdb

또한 첫 번째 스크립트와 다른 다른 스크립트를 사용하여 각 파일의 처음 세 문자와 확장자(.pdb)만 사용하여 새 디렉터리의 파일 이름을 바꾸고 싶습니다. 따라서 최종 디렉터리의 내용은 다음과 같아야 합니다.

VIV.pdb
XMG.pdb
ZTW.pdb

누구든지 나를 도와줄 수 있나요? 감사해요

답변1

파일 이름 루트가 외부 파일에 있는 경우 bash 루프를 사용하여 해당 내용을 반복할 수 있습니다.

#!/bin/bash
shopt -s  nullglob

sourcedir=/home/scrivania/pdb_files
targetdir=/home/scrivania/news/

while IFS= read -r froot
do
    for file in "$sourcedir/$froot"*.pdb
    do
        cp "$file" "$targetdir/$froot.pdb"
    done
done < list.txt
  • 이는 파일의 항목을 반복한 다음 표시된 세 문자로 시작하고 로 끝나는 파일을 반복합니다 .pdb. 소스 디렉토리에 해당 파일이 하나만 있다고 명시했으므로 이 내부 for루프는 에서 시작하는 데 사용됩니다 list.txt. shopt -s nullglob그러한 파일이 존재하지 않는 곳(가능성이 낮음)에서 루프가 해당 파일을 발견하지 않는지 확인하십시오 .
  • "내부" for루프에서 스크립트는 파일을 대상 디렉터리에 복사합니다. 현재 형식에서는 지정한 대로 파일이 복사될 때 파일 이름이 변경됩니다. 이것이 원하는 것이 아니라면 행을 다음으로 변경하십시오.
    cp "$file" "$targetdir"
    
    두 번째 스크립트에서 이름을 바꿉니다.
  • 세 글자로 시작하는 파일이 항상 있을 것이라고 확신한다면 루프를 생략 for하고 다음으로 바꿀 수 있습니다.
    cp "$sourcedir/$froot"*.pdb "$targetdir/$froot.pdb"
    

답변2

#!/bin/bash
입력="파일.txt"
IFS=는 -r 라인을 읽는 동안
하다
 /bin/cp "${line}_A.pdb" "/home/scrivania/news/${line}.pdb"
완벽한

해야 할 것.

답변3

#!/usr/bin/sh

for XXX in $(cat list.txt)
do
  cp /tmp/home/scrivania/pdb_files/${XXX}*.pdb /tmp/home/scrivania/news/$XXX.pdb
done

관련 정보