machineB
어떤 파일이 들어 있는지 , 어떤 파일이 들어 있는지 알아보려고 합니다 machineC
.
어떤 파일이 있고 어떤 파일이 있는지 machineA
확인 하려면 쉘 스크립트를 실행해야 합니다.machineB
machineC
약 300개의 파일 machineB
이 machineC
.
이제 어떤 파일이 어떤 컴퓨터에 있는지 확인하고 싶습니다 (machineB or machineC)
.
아래는 내가 실행 중인 쉘 스크립트 machineA
이며 여기 PRIMARY_PARTITION
에는 일부 파일 번호와 SECONDARY_PARTITION
일부 파일 번호가 있습니다. 이 파일은 이 디렉토리에 있습니다.
/data/snapshot/20140317
또는 machineB
.. machineC
파일 경로는 다음과 같습니다 -
t1_1980_0_200003_5.data
t1_1980_3_200003_5.data
t1_1980_5_200003_5.data
t1_1980_7_200003_5.data
t1_1980_9_200003_5.data
여기의 파일 번호는 0, 3, 5, 7, 9입니다. filename
파일번호를 제외하고 이름은 항상 동일합니다.
#!/bin/bash
readonly FILERS_LOCATION=(machineB machineC)
readonly MEMORY_MAPPED_LOCATION=/data/snapshot
PRIMARY_PARTITION=(0 3 5 7 9)
SECONDARY_PARTITION=(1 2 4 6 8)
dir1=20140317
dir2=20140317
echo $dir1
echo $dir2
if [ "$dir1" = "$dir2" ]
then
for el in "${PRIMARY_PARTITION[@]}"
do
# do something here may be?
done
for sl in "${SECONDARY_PARTITION[@]}"
do
# do something here may be?
done
fi
이제 내 질문은 machineB
및 machineC
. 에서 어떤 파일이 있고 어떤 파일이 있는지를 의미 (0 3 5 7 9)
합니다 .(1 2 4 6 8)
machineB
machineC
예를 들어, 위에 아주 작은 파일 세트를 표시했습니다. 일반적으로 파일이 너무 많아서, machineB, machineC에 로그인해서 파일을 찾는 것이 꽤 어려울 것 같아요.
답변1
나는 즉시 두 가지 접근 방식을 생각할 수 있습니다. 첫 번째는 & 의 조합을 사용하는 것이고 rsync
두 번째는 ssh
& 를 사용하는 것입니다 diff
.
노트:두 가지 방법 모두 시스템 A의 모든 파일이 포함된 디렉토리를 시스템 B 및 C에 있는 해당 파일의 하위 집합과 비교하여 어느 시스템(B 또는 C)이 문제의 파일의 시작자인지를 보여줍니다.
샘플 데이터
machineA에 다음 파일 설정이 있다고 가정해 보겠습니다.
$ ls
t1_1980_10_200003_5.data t1_1980_4_200003_5.data t1_1980_8_200003_5.data
t1_1980_1_200003_5.data t1_1980_5_200003_5.data t1_1980_9_200003_5.data
t1_1980_2_200003_5.data t1_1980_6_200003_5.data
t1_1980_3_200003_5.data t1_1980_7_200003_5.data
방법 #1 - 재동기화
이제 이 디렉토리의 어떤 파일이 machineB의 것인지 알아 보겠습니다.
$ rsync --dry-run -avz machineB:~/20140317/ .
receiving incremental file list
./
t1_1980_1_200003_5.data
t1_1980_2_200003_5.data
t1_1980_3_200003_5.data
t1_1980_4_200003_5.data
t1_1980_5_200003_5.data
sent 29 bytes received 165 bytes 129.33 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
그리고 기계 C:
$ rsync --dry-run -avz machineC:~/20140317/ .
receiving incremental file list
./
t1_1980_10_200003_5.data
t1_1980_6_200003_5.data
t1_1980_7_200003_5.data
t1_1980_8_200003_5.data
t1_1980_9_200003_5.data
sent 29 bytes received 166 bytes 390.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
방법 #2 - ssh + diff
대안으로, 몇 가지 준기본적인 방법을 사용하여 유사한 작업을 수행 ssh
할 수 있습니다.diff
$ cd /dir/with/machBC
$ diff -B <(ssh user@machineB "ls -R ~/20140317/") <(ls -R .)
> .:
> t1_1980_10_200003_5.data
> t1_1980_6_200003_5.data
> t1_1980_7_200003_5.data
> t1_1980_8_200003_5.data
> t1_1980_9_200003_5.data
답변2
귀하의 질문을 올바르게 이해했다면 (큰 경우) machineA에서 다음과 같은 것을 실행할 것입니다.
#!/usr/bin/env bash
file_pattern='t1_1980_*_200003_5.data';
target_dir='/data/snapshot/20140317/'
## Save the files from each machine into bash array
files_on_B=$(ssh user@machineB find "$target_dir" -name "$file_pattern")
files_on_C=$(ssh user@machineC find "$target_dir" -name "$file_pattern")
## Do whatever you like with them, here I am simply printing
echo "Files from B: ${files_on_B[@]}"
echo "Files from C: ${files_on_C[@]}"
이 스크립트는 예제에 표시된 대로 파일 이름이 공백, 개행 또는 기타 이상한 문자 없이 정상이라고 가정합니다.