매우 복잡한 파일 복사 프로세스

매우 복잡한 파일 복사 프로세스

나는 복잡한 도전에 직면해 있습니다. 저는 Linux와 스크립팅에 능숙하지 않지만 문제를 해결해야 합니다. 두 개의 열이 포함된 list.txt 파일이 있습니다. 첫 번째 열은 개체 이름이고 두 번째 열은 변수입니다. 이제 이 정보를 사용하여 특정 디렉터리의 특정 파일을 복사하고 싶습니다. 예를 들어:

작업 디렉토리는 다음과 같습니다./nfs/BioGPSDB/pockets/MD/fixed/1/

파일은 다음과 같습니다 /home/tommaso/Desktop/list.txt.

121p1_004_______________  GCP
13gs1_001_______________  SAS
1am42_003_______________  GNP
1bmq1_003_______________  MNO
   ecc...

아래 표시된 작업 디렉터리에는 많은 디렉터리가 있으며, 그 중 일부는 "list.txt" 파일의 첫 번째 열에 있는 개체 이름의 처음 5자와 관련된 이름을 갖습니다. 예: 1j4r3, 1t403, 121p1,1sdr4, 1bmq1ecc...

각 디렉토리에는 많은 파일이 있습니다. "list.txt" 파일의 각 줄에 대해 첫 번째 열을 사용하여 디렉터리를 선택하려면 이 디렉터리로 이동하여 관심 있는 파일을 선택하고 다른 디렉터리에 복사해야 합니다 (/home/tommaso/Desktop/pdb_files). 관심 있는 파일은 "list.txt" 파일의 두 번째 열에 보고된 변수와 유사하게 호출됩니다. 예:

directory: /nfs/BioGPSDB/pockets/MD/fixed/1/121p1
File of interest: "GCP_?.pdb" where "?" is one character (letter or number)
Final directory: /home/tommaso/Desktop/pdb_files

따라서 결국 디렉토리에는 /home/tommaso/Desktop/pdb_files다음과 같은 모든 파일이 있어야 합니다. GCP_?.pdb, SAS_?.pdb, GNP_?.pdb, MNO_?.pdb ecc..

따라서 스크립트는 list.txt파일을 읽어야 하며 첫 번째 열의 각 줄에 처음 5자로 명명된 각 디렉터리에 대해 두 번째 열에 변수라는 파일을 복사해야 하며 "_?.pdb"모든 파일에 대한 확장자를 복사하면 최종 디렉터리에 나타납니다.

충분히 명확했으면 좋겠습니다. 어디서부터 시작해야 할지 모르기 때문에 저를 기꺼이 도와줄 사람을 찾길 바랍니다!

답변1

다음을 사용하여 이 작업을 수행할 수 있어야 합니다.

cd /nfs/BioGPSDB/pockets/MD/fixed/1/
while IFS= read -r line
do
  echo cp -i -- "${line:0:5}/${line##* }"_?.pdb /home/tommaso/Desktop/pdb_files/
done < /home/tommaso/Desktop/list.txt

인쇄된 명령이 만족스러우면 삭제 echo하여 실제로 파일을 복사하십시오 cp.

당신이 가지고 있다고 가정하나파일은 ${line##* }"_?.pdb각 디렉터리의 패턴과 일치합니다. 명령줄을 다음과 같이 _?.pdb변경하여 이를 수행할 수도 있습니다 cp.

cp -i -- "${line:0:5}/${line##* }"_?.pdb \
  "/home/tommaso/Desktop/pdb_files/${line##* }_?.pdb"

-i옵션은 cp요구 사항에 따라 대상 디렉터리의 파일을 덮어쓰기 전에 묻도록 지시합니다. 이는 필요하지 않지만 다른 디렉터리의 파일을 단일 디렉터리로 복사/이동하는 경우에는 의미가 있습니다.

스크립트는 각 파일 이름 조각 앞에 하나 이상의 공백이 있다고 가정합니다 list.txt. 해당하는 경우 공백을 ${line##* }파일 이름 부분 바로 앞의 문자로 바꿉니다 .

다양한 쉘(bash, ksh93, zsh, busybox ash 등)은 " 인덱스 0(첫 번째 문자)에서 시작하는 변수 ${line:0:5}의 5문자 하위 문자열 로 대체"되는 이 확장을 지원 line하지만 POSIX의 일부는 아닙니다. 특히 대시에서는 사용할 수 없습니다.

관련 정보