![하위 디렉터리에서 인접한 하위 디렉터리로 파일을 복사하는 방법은 무엇입니까?](https://linux55.com/image/173704/%ED%95%98%EC%9C%84%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%97%90%EC%84%9C%20%EC%9D%B8%EC%A0%91%ED%95%9C%20%ED%95%98%EC%9C%84%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EB%A1%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EB%B3%B5%EC%82%AC%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
내 계층 구조는 MyPDB - (5rea,5res,5rez)입니다. 여기서 각 5rea
, , .. 에는 이라는 5res
디렉터리가 포함되어 있습니다 . etc 아래의 각 하위 디렉터리에서 이미 존재하는 다른 하위 디렉터리 로 복사하고 싶습니다 . 무엇이 문제인지 알려주세요. MD
production_10ns.out
production_10ns.out
MD
5rea
5res
analysis
5rea
5res
나는 열심히 노력했다
$ 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
코드에는 두 가지 문제가 있습니다.
- 변수는 일반적으로 점( 루프
production_10ns.out
에서 변수 이름으로 사용됨for
)을 포함할 수 없습니다. - 한 번에 여러 디렉터리에 파일을 복사할 수 없습니다
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
코드를 좀 더 깔끔하게 만들기 위해 추가 변수가 추가되었습니다 .