
Linux bash에서 한 디렉토리의 파일이 다른 디렉토리에 재귀적으로 존재하고 인쇄가 존재하는지 여부를 찾습니다.
당신이 가지고 있다고 말하자
pth1/dirA/file1
pth1/dirA/DirB/file2
그리고pth2/dirA/file1
pth2/dirA/DirB/file3
나는 그 보고서를 원한다
file1 exists
files2 dont exist in pth2
files3 dont exist in pth1
두 디렉터리 모두에 대해 현재 수준에서 작동하는 코드를 찾았지만 재귀적으로 작동하도록 만들 수는 없습니다.여기에서 가져온
pth1="/mntA/newpics";
pth2="/mntB/oldpics";
for file in "${pth1}"/*; do
if [[ -f "${pth2}/${file##*/}" ]]; then
echo "$file exists";
fi
done
두 경로 모두에서 재귀적으로 작업하려면 어떻게 해야 합니까?
답변1
다른 방법으로 했어요. 하나의 디렉토리에서 모든 파일을 찾고 해당 경로를 제거한 다음 결과를 두 개의 다른 파일에 저장하고 이를 meld 또는 다른 프로그램과 비교할 수 있거나 찾은 내용을 meld와 직접 비교할 수 있습니다.
파일을 정렬하고 고유한 파일만 선택하며 결과에서 중복되지는 않습니다. 또한 파일 이름이 "jpg" 확장자로 끝나는 파일에만 관심이 있습니다.
pth1="/mnt/oldfiles";
pth2="/mnt/newfiles";
그런 다음
(find "${pth1}"/ -exec basename {} \; | grep "jpg$" | sort | uniq ) > a.txt;
(find "${pth2}"/ -exec basename {} \; | grep "jpg$" | sort | uniq ) > b.txt;
meld a.txt b.txt
또는 직접
meld <(find "${pth1}"/ -exec basename {} \; | grep "jpg$" | sort | uniq ) <(find "${pth2}"/ -exec basename {} \; | grep "jpg$" | sort | uniq )
업데이트: 한 디렉터리가 다른 디렉터리보다 훨씬 크면 직접 명령이 작동하지 않습니다(두 명령이 모두 완료되지 않고 MILD가 열립니다).
답변2
당신이 원하는 것이 무엇인지는 명확하지 않지만 이것이 효과가 있을 것이라고 생각합니다. 이 명령은 아래의 모든 파일을 /path/1
아래의 파일과 비교하여 /path/2
존재 여부와 동등성을 확인합니다.
diff --brief --recursive /path/1 /path/2
실제 사례
# Create some files
mkdir -p 1/{x,y} 2/{x,z}
touch 1/{x,y}/file1
date | tee 2/x/file1 >2/z/date
# Show what we have
tree 1 2
1
├── x
│ └── file1
└── y
└── file1
2
├── x
│ └── file1
└── z
└── date
4 directories, 4 files
# Compare the two directory trees
diff --brief --recursive 1 2
Files 1/x/file1 and 2/x/file1 differ
Only in 1: y
Only in 2: z