특정 디렉토리에 많은 파일이 있습니다. 예를 들어:
- 디렉토리가 있습니다:
/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