만들고 싶은 bash 스크립트를 만드는 데 문제가 있습니다.
ls가 디렉터리의 파일을 나열한다는 것을 알고 있지만 디렉터리 1에는 디렉터리가 나열되지만 디렉터리 2에는 나열되지 않은 다음 디렉터리 1에는 없는 디렉터리 2의 파일이 나열되기를 원합니다.
나는 미약한 시도로 다음을 시도했습니다.
ls -al | diff directory1 directory2
왜 그것이 작동하지 않는지 깨닫는 데는 오랜 시간이 걸리지 않았습니다. 누구든지 완전한 괴짜를 도울 수 있습니까?
답변1
bash를 고려하면 아마도 이것이 가장 간단할 것입니다.
$ comm <(ls -a dir1) <(ls -a dir2)
표현식 <(command)
실행주문하다참조를 파이프하고 교체합니다 /dev/fd
.
mress:10018 Z$ echo <(ls)
/dev/fd/11
따라서 위의 명령은 ls -a
각 디렉터리에서 실행되고 해당 출력을 파일 인수로 제공하여 comm
최대 3개의 열을 출력하고 탭을 들여쓰기합니다. 첫 번째 디렉터리의 항목만, 두 디렉터리의 항목, 두 디렉터리 모두의 항목입니다. (즉, 두 파일 모두에 있으면 탭 한 개 들여쓰기되고, 두 번째 파일에만 있으면 탭 두 개 들여쓰기됩니다.) 숫자별로 열을 표시하지 않을 수도 있습니다. comm -1 foo bar
두 파일의 줄만 표시하고 두 번째 파일의 줄만 표시합니다 . 파일, 후자는 다음으로 들여쓰기됨하나상표. (가장 일반적인 방법은 필수 열을 제외한 모든 열을 표시하지 않는 것입니다. comm -13 foo bar
일반적인 행만 표시됩니다.)
첫 번째 디렉토리의 내용을 원한다고 가정하면 이는 다음을 의미합니다.
$ comm -23 <(ls -a dir1) <(ls -a dir2)
존재 여부 이상의 것이 필요한 경우 diff -r
다음을 사용하십시오 .
답변2
이것은 순수한 스크립트입니다. 다음은 디렉토리 a와 b입니다.
find a b
a
a/a
a/b
a/c
a/f
a/f/h
a/f/i
b
b/b
b/c
b/d
b/f
b/f/g
b/f/h
이것은 명령입니다:
cd a
find ./ -exec test ! -e ../b/{} ";" -print
산출:
./a
./f/i
a와 b를 교환하여 a에서는 파일을 얻지만 b에서는 얻지 않습니다. 이것! 아니오입니다. -e 테스트 - 존재합니다. Prosa에서: "../b의 a에서 찾은 파일이 존재하지 않는지 테스트합니다."
참고: "a"가 없는 이름을 얻으려면 먼저 더 자세히 조사해야 합니다. 두 번째 비교를 위해서는 cd 가 필요합니다 ../b
.
답변3
그래픽 도구를 선호하는 경우 다음을 사용하십시오.
xxdiff dir1 dir2
먼저 설치해야 할 수도 있습니다. 비슷한 프로그램이 있어요
gtkdiff
tkdiff
Midnight Commander에는 compare directories
하위 디렉터리를 사용하지 않는 경우에도 효과적으로 작동하는 명령이 내장되어 있습니다.
답변4
이 문제를 해결하려면 find
및 를 사용할 수 있습니다 .awk
다음 레이아웃을 사용합니다.
$ mkdir a b a/1 b/1 b/2 a/3
$ touch a/f1 b/f1 a/f2 b/f3
첫 번째 부분:
$ find a b -mindepth 1 -maxdepth 1 -type d | \
awk -F/ ' { if (!w[$1]) w[$1]=++i; if (w[$1]>1) b[$2]=1; else a[$2]=1; }
END { for (x in a) if (!b[x]) print x }'
3
두 번째 부분:
$ find b a -mindepth 1 -maxdepth 1 -type f | \
awk -F/ ' { if (!w[$1]) w[$1]=++i; if (w[$1]>1) b[$2]=1; else a[$2]=1; }
END { for (x in a) if (!b[x]) print x }'
f3
이를 다음 솔루션과 comm
비교해 보세요 .
$ comm -23 <(ls a) <(ls b)
3
f2
$ comm -13 <(ls a) <(ls b)
2
f3
그리고 join
해결책을 제안합니다:
$ join -v1 <(ls a) <(ls b)
3
f2
$ join -v2 <(ls a) <(ls b)
2
f3