bash 쉘 스크립트를 사용하여 다른 컴퓨터의 모든 파일을 찾는 방법은 무엇입니까?

bash 쉘 스크립트를 사용하여 다른 컴퓨터의 모든 파일을 찾는 방법은 무엇입니까?

machineB어떤 파일이 들어 있는지 , 어떤 파일이 들어 있는지 알아보려고 합니다 machineC.

어떤 파일이 있고 어떤 파일이 있는지 machineA확인 하려면 쉘 스크립트를 실행해야 합니다.machineBmachineC

약 300개의 파일 machineBmachineC.

이제 어떤 파일이 어떤 컴퓨터에 있는지 확인하고 싶습니다 (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

이제 내 질문은 machineBmachineC. 에서 어떤 파일이 있고 어떤 파일이 있는지를 의미 (0 3 5 7 9)합니다 .(1 2 4 6 8)machineBmachineC

예를 들어, 위에 아주 작은 파일 세트를 표시했습니다. 일반적으로 파일이 너무 많아서, 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[@]}"

이 스크립트는 예제에 표시된 대로 파일 이름이 공백, 개행 또는 기타 이상한 문자 없이 정상이라고 가정합니다.

관련 정보