![두 디렉터리 사이의 파일 합계를 확인하세요.](https://linux55.com/image/121458/%EB%91%90%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%20%EC%82%AC%EC%9D%B4%EC%9D%98%20%ED%8C%8C%EC%9D%BC%20%ED%95%A9%EA%B3%84%EB%A5%BC%20%ED%99%95%EC%9D%B8%ED%95%98%EC%84%B8%EC%9A%94..png)
두 디렉터리 사이의 파일 체크섬을 확인하고 싶습니다.
이를 위해 다음 스크립트를 작성했습니다.
#!/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