하위 디렉터리에서 인접한 하위 디렉터리로 파일을 복사하는 방법은 무엇입니까?

하위 디렉터리에서 인접한 하위 디렉터리로 파일을 복사하는 방법은 무엇입니까?

내 계층 구조는 MyPDB - (5rea,5res,5rez)입니다. 여기서 각 5rea, , .. 에는 이라는 5res디렉터리가 포함되어 있습니다 . etc 아래의 각 하위 디렉터리에서 이미 존재하는 다른 하위 디렉터리 로 복사하고 싶습니다 . 무엇이 문제인지 알려주세요. MDproduction_10ns.outproduction_10ns.outMD5rea5resanalysis5rea5res

나는 열심히 노력했다

$ for production_10ns.out in /scratch/srnaik/MyPDB/*/MD
 do cp production_10ns.out /scratch/srnaik/MyPDB/*/analysis/
 done

답변1

나는 이것이 당신이 찾고있는 계층 구조라고 생각합니다

scratch/
└── srnaik
    └── MyPDB
        ├── 5rea
        │   ├── MD
        │   │   └── production_10ns.out
        │   └── analysis
        │       └── production_10ns.out
        ├── 5res
        │   ├── MD
        │   │   └── production_10ns.out
        │   └── analysis
        │       └── production_10ns.out
        └── 5rez
            ├── MD
            │   └── production_10ns.out
            └── analysis
                └── production_10ns.out

그렇다면 이 스크립트가 그 효과를 발휘할 것입니다.

#!/bin/bash

cd /scratch/srnaik/MyPDB

for i in {a..z}; do
    [ -d "5re${i}" ] && cp 5re${i}/MD/production_10ns.out 5re${i}/analysis/
done

답변2

코드에는 두 가지 문제가 있습니다.

  1. 변수는 일반적으로 점( 루프 production_10ns.out에서 변수 이름으로 사용됨 for)을 포함할 수 없습니다.
  2. 한 번에 여러 디렉터리에 파일을 복사할 수 없습니다 cp. 대상 경로로 globbing 패턴을 사용하여 이 작업을 수행하는 것으로 보입니다.

대신 모든 파일을 반복하여 production_10ns.out새 위치에 복사하세요.

for pathname in /scratch/srnaik/MyPDB/*/MD/production_10ns.out; do
    cp "$pathname" "${pathname%/*}/../analysis"
done

여기서는 각 반복에서 파일의 절대 경로 이름이 "$pathname"됩니다 .production_10ns.out

확장은 ${pathname%/*}경로 이름 끝에 있는 실제 파일 이름을 제거하므로 이면 $pathname으로 확장 /scratch/srnaik/MyPDB/5rea/MD/production_10ns.out됩니다 .${pathname%/*}/scratch/srnaik/MyPDB/5rea/MD

$( dirname "$pathname" )대신 사용할 수도 있습니다 ${pathname%/*}.

for pathname in /scratch/srnaik/MyPDB/*/MD/production_10ns.out; do
    cp "$pathname" "$( dirname "$pathname" )/../analysis"
done

../analysis형제 analysis디렉터리는 대상 경로의 끝에서 발견됩니다.

디렉토리가 존재한다고 가정하면 이 cp명령은 파일을 디렉토리에 복사합니다.

도착하다확실하게 하다대상 디렉토리가 존재합니다.

mypdb_dir=/scratch/srnaik/MyPDB

for pathname in "$mypdb_dir"/*/MD/production_10ns.out; do
    [ ! -f "$pathname" ] && continue

    targetdir=$( dirname "$pathname" )/../analysis
    mkdir -p "$targetdir" || exit 1

    cp "$pathname" "$targetdir"
done

아직 존재하지 않는 경우 대상 디렉토리가 생성되고, 그렇지 않으면 디렉토리 생성에 실패하여 쉘이 종료됩니다.

또한 현재 조사 중인 파일이 실제로 존재하며 먼저 일반 파일인지 명시적으로 테스트합니다(테스트 통과 -f). 반복하는 패턴이 일치하지 않는 경우어느파일이 확장되지 않은 상태로 유지되며 테스트에서 이 사례를 포착합니다.

mypdb_dir코드를 좀 더 깔끔하게 만들기 위해 추가 변수가 추가되었습니다 .

관련 정보