두 디렉터리 사이의 파일 합계를 확인하세요.

두 디렉터리 사이의 파일 합계를 확인하세요.

두 디렉터리 사이의 파일 체크섬을 확인하고 싶습니다.

이를 위해 다음 스크립트를 작성했습니다.

#!/bin/bash

echo Checking File Copy

SRC_DIR=/home/user/src

echo Source Directory: $SRC_DIR

TGT_DIR=/media/user/tgt

echo Target Directory: $TGT_DIR

cd $SRC_DIR

for file_name in *.txt
do
 echo $file_name
 tgt_file=${file_name// /\\ }
 sum $TGT_DIR/$tgt_file
 sum $file_name
done

스크립트는 이름에 공백이 있는 파일을 발견할 때까지 잘 작동하지만, 그 지점에서 오류가 발생합니다.

나는 다음과 같이 파일 이름을 "이스케이프"하여 이 문제를 해결하려고 했습니다.

tgt_file=${file_name// /\\ }

불행하게도 이로 인해 파일 이름을 읽을 때 오류가 발생합니다.

검색했지만 작동하는 답변을 찾지 못했습니다. 어떤 제안이라도 환영합니다. 감사해요.

답변1

당신은하지 않습니다큰따옴표당신의 변수 중 하나. 큰따옴표로 묶인 문자열(변수가 있는 문자열 포함)은 단일 토큰으로 처리됩니다. 그렇지 않으면 공백으로 구분된 토큰 목록으로 처리됩니다. 뒤에 공백이 나타나는 경우에도 작동합니다.매개변수 확장- 귀하의 경우와 같습니다.

이것이 왜 중요한지에 대한 자세한 내용은 다음 게시물을 참조하세요.

스크립트는 다음과 같습니다.

#!/bin/bash

echo "Checking File Copy"

SRC_DIR="/home/user/src"

echo "Source Directory: ${SRC_DIR}"

TGT_DIR="/media/user/tgt"

echo "Target Directory: ${TGT_DIR}"

cd "${SRC_DIR}"

for file_name in *.txt
do
 echo "${file_name}"
 sum "${TGT_DIR}/${file_name}"
 sum "${file_name}"
done

내가 문자열과 변수를 인용했다는 것을 알 수 있을 것입니다. 엄밀히 말하면 여기서는 꼭 필요한 것은 아니지만, 단일 태그로 취급하고 싶은 모든 것을 인용하는 습관을 들이는 것이 좋을 수도 있습니다.

또한 변수에 중괄호 구문을 사용했습니다. 다시 말하지만, 이 경우에는 이것이 필요하지 않을 수도 있지만 일반적인 모범 사례라고 생각합니다. 중괄호 구문에 대한 자세한 내용은 다음 게시물을 참조하세요.

답변2

diff -q <(ls -1 $dir1 | wc -l) <(ls -1 $dir2 | wc -l)

LS-1파일 목록을 한 줄에 하나씩 제공합니다.

화장실-l줄을 세어보세요

편집하다:

for file in $(sort -u <(ls -1 $dir1/; ls -1 $dir2/)); do echo $file; diff -q <(checksumcommand $dir1/$file) <(checksumcommand $dir2/$file); done

관련 정보