다음과 같은http://superuser.com/questions/1780479그리고http://superuser.com/questions/1777606, $1 및 $2 디렉터리에서 동일한 전체 경로 심볼릭 링크의 시간을 비교하기 위해 다음 스크립트를 실행합니다.
#!/bin/bash
cd $1
find . -type l -exec bash -c "if [[ -h \"{}\" && -h \"$2/{}\" ]]; then if (test $(readlink \"{}\") = $(readlink \"$2/{}\")) then if (find \"$2/{}\" -prune -newer \"{}\" -printf 'a\n' | grep -q a) then echo \"{} is older than $2/{}\"; else if (find \"{}\" -prune -newer \"$2/{}\" -printf 'a\n' | grep -q a) then echo \"$2/{} is older than {}\"; fi; fi; fi; fi" \;
사용법은Compare_times.sh 디렉토리_1 디렉토리_2( compare_times.sh
스크립트 이름은 어디에 있습니까?) 다음 예와 같이 사용합니다.
user@machine:/tmp/D1$ ls -lt --full-time /tmp/linked_file /tmp/D*
-rw-r--r-- 1 user user 0 2023-04-25 00:12:09.289942358 +0200 /tmp/linked_file
/tmp/D2:
total 0
lrwxrwxrwx 1 user user 14 2023-04-25 00:07:00.265830604 +0200 lnk -> ../linked_file
/tmp/D1:
total 0
lrwxrwxrwx 1 user user 14 2023-04-25 00:06:40.922078186 +0200 lnk -> ../linked_file
user@machine:/tmp/D1$ compare_times.sh . ../D2
./lnk is older than ../D2/./lnk
user@machine:/tmp/D1$
보시다시피, find
전화 bash
자체가 전화합니다 find
. (아마도 이렇게 쓰는 것이 더 우아할 것 같지만 지금은 그게 요점이 아닙니다.) 이렇게 부르는 find
것이 find
문제가 있는 걸까요 ?
명령의 매뉴얼 페이지에는 재진입 find
가능 여부가 나와 있지 않습니다 . 재진입이 find
없으면 find
일부 출력, 즉 두 디렉터리에서 동일한 이름과 동일한 위치를 갖고 동일한 파일 이름을 가리키지만 타임스탬프가 다른 일부 심볼릭 링크가 자동으로 누락될 수 있다고 가정해 보겠습니다.
답변1
모든 명령을 다시 입력할 수 있는 것은 아닙니다.
당신은 무엇에 대한 생각?
일반적으로 재진입은 일부 전역 상태를 암시적으로 사용하고 함수를 동시에 두 번 호출하는 라이브러리 함수에 문제를 일으킵니다(예: 자체 내에서 함수를 호출하면 해당 상태가 엉망이 됩니다). (예를 들어malloc()과 printf()가 재진입이 불가능한 이유는 무엇입니까?그게 다야. )
그러나 프로세스 사이에는 전역 상태가 없으며 모두 자체 메모리 공간과 운영 체제를 갖고 있으며 하드웨어는 프로세스가 다른 프로세스의 메모리를 방해하지 않도록 보장합니다. 물론, 예를 들어 파일 시스템은 전역 상태이지만 find
상태를 저장하기 위해 이를 사용해야 할지 잘 모르겠습니다 . 어쨌든 임시 파일이 필요한 존경할 만한 프로그램은 일반적으로 고유한 임시 파일을 사용하는 데 매우 능숙합니다.
파일 시스템의 상태가 문제인 경우 find
서로의 하위 프로세스를 호출하는 프로세스에 특정할 수 있는지 확인하기 어렵지만 동시 find
프로세스를 실행하기 시작했을 것입니다.
한 파일에서 다른 파일을 실행하는 것이 얼마나 유용한지는 또 다른 질문입니다. 하지만 이 작업을 수행하면 ...이라는 디렉터리 아래에서 모든 일반 파일을 find
찾을 수 있을 것 같습니다 .x
$ mkdir -p {a/x,b,x}; touch {a/x,b,x}/foo.txt
$ find . -type d -name x -exec find {} -type f \;;
./a/x/foo.txt
./x/foo.txt