[unix] 여러 디렉토리 사이에서 공통 파일 세트를 찾으십니까?

Drupal 테마의 디렉토리를 비교하려고합니다. Drupal 테마는 여러 파일로 구성된 디렉토리이며 어떤 파일이 필수인지 알아 내려고합니다. 예를 들어, 모두 template.php또는 라는 파일이있을 수 있습니다 page.tpl.php.

여러 디렉토리에 대한 모든 공통 파일 세트를 찾으려면 어떻게해야합니까? 필자의 경우 모든 ‘동일한’파일 (같은 이름의 파일)은 동일한 레벨 디렉토리에 있습니다.



답변

모든 디렉토리에 공통 인 파일의 모든 이름 (경로 아님)을 나열하십시오.

dirs=( "A dir" "B dir" "C dir" "D dir" )
find "${dirs[@]}" -maxdepth 1 -type f -name "*" -printf '%f\n' |
  sort | uniq -c | sed -n "s/^ *${#dirs[@]} //p"

또는 디렉토리를 매개 변수로 사용하여 스크립트 파일 또는 함수로 호출하십시오.

find "$@" -maxdepth 1 -type f -name "*" -printf '%f\n' |
  sort | uniq -c | sed -n "s/^ *$# //p"


답변

표시되는 디렉토리 수에 따라 정렬 된 이름 목록을 표시 할 수 있습니다.

find */ |              # traverse all the template directories
sort -t / -k 2 |       # sort, ignoring the first field
tr '/' '\t' |          # turn / into tabs
uniq -f 1 -c |         # count duplicates, ignoring the first field
tr '\t' '/' |          # turn tabs back into /
sort -t / -s -k 1n     # sort by the number of occurrences


답변

Meld 를 사용하면 두 디렉토리를 비교하고 어느 파일이 다른 파일이 아닌 다른 파일에 있는지 확인할 수 있습니다. 공통 파일 간의 차이점을 보여줄 수도 있습니다.


답변

3 개의 디렉토리, 그중 하나가 현재 디렉토리이고 2 개의 ‘a’와 ‘b’의 경우 다음과 같이 테스트를 연결할 수 있습니다.

ls a/$(ls b/$(ls *.php) 2>/dev/null) 2>/dev/null

파일에 .php와 같은 공통 패턴이 있고 파일 이름에 공백이없는 경우

ls스크립트에서 사용 하는 것은 항상 문제가되고 일반적으로 사용하지 않는 것이 좋지만 검색이 시작되는 디렉토리의 모든 파일에 대한 개요가 있고 공백이나 “*”또는 “와 같은 특수 문자가 포함되어 있지 않은 경우? “,”< “또는”| “를 사용하려면 저장해야합니다.


답변