Tree Command: 최종 프로젝트에서 형식 종속성을 피할 수 있습니까?

Tree Command: 최종 프로젝트에서 형식 종속성을 피할 수 있습니까?

저는 로컬 디렉터리를 동일한 디렉터리의 USB 백업 버전과 비교하여 주목할만한/삭제할 수 있는 차이점을 식별하고 있습니다 tree.diff

$ cd home/dir/
$ tree --charset=ascii -af . > ~/tree__local

$ cd {usb}/home/dir/
$ tree --charset=ascii -af . > ~/tree__usb

$ diff ~/tree__local ~/tree__usb > ~/diff-analysis.txt

하지만 트리에는 마지막 항목의 상위 분기를 떠나는 습관이 있다는 것을 알았습니다. 음, 말로 설명하기는 어렵습니다.

$ tree --charset=ascii -af .
.
|-- ./bar
|   |-- ./bar/babushka
|   |-- ./bar/galeda
|   `-- ./bar/helga
`-- ./foo
    |-- ./foo/alpha
    |-- ./foo/beta
    `-- ./foo/gamma

8 directories, 0 files

# add a new final item.
$ touch zebra

# same command.
$ tree --charset=ascii -af .
.
|-- ./bar
|   |-- ./bar/babushka
|   |-- ./bar/galeda
|   `-- ./bar/helga
|-- ./foo
|   |-- ./foo/alpha
|   |-- ./foo/beta
|   `-- ./foo/gamma
`-- ./zebra

8 directories, 1 file

foo/의 파일이 어떻게 추가 파이프라인 분기를 얻는지 확인하세요. 이 diff명령은 파일 자체가 실제로 전혀 다르지 않더라도 이를 차이점으로 표시합니다.

이것은매우내 목적에 적합하지 않습니다. 이를 우회하거나 방지하는 방법을 알고 있습니까? 균일한 분기관을 누른 상태로 유지할 수 있습니까? 매뉴얼 tree에는 "마지막" 또는 "최종" 항목의 형식 지정에 대한 언급이 없습니다.

답변1

출력은 tree표시용이므로 구문 분석에는 그다지 유용하지 않습니다.

두 디렉터리 계층을 직접 비교하는 것이 더 좋습니다. 예를 들어 다음과 같이 할 수 있습니다 rsync.

rsync --dry-run --archive --delete --itemize-changes home/dir/ "$usb_path"/home/dir/

(포함 --dry-run또는 이 옵션의 짧은 변형인 -n은(는)매우 중요.)

이 명령은 로컬 디렉터리와 USB 장치의 디렉터리 간의 차이점을 정확하게 알려줍니다. 이 옵션을 사용하여 실행하면 disk에는 변경 사항이 발생하지 않습니다 --dry-run. 이 --itemize-changes옵션은 rsync복사하거나 삭제할 각 파일이나 디렉터리에 대한 간략한 상태 문자열을 출력하여 동기화 이유를 인코딩합니다.

--omit-dir-times타임스탬프가 다른 디렉터리를 나열하지 않도록 옵션 목록 끝에 추가되었습니다 . --ignore-existing크기나 메타데이터가 다르더라도 두 위치에 모두 존재하는 파일을 무시하도록 추가되었습니다 . 위 명령에 이 두 가지 추가 옵션을 추가하면 다음과 같은 접두사가 붙은 출력 줄이 표시됩니다.

  • *deleting, 로컬 디렉터리에서는 삭제되었지만 USB 장치에서는 삭제되지 않은 콘텐츠의 경우,
  • cd+++++++++, 로컬 디렉토리에 추가된 디렉토리의 경우 또는
  • >f+++++++++, 로컬 디렉터리에 추가된 파일의 경우.

답변2

더 나은 사용을 위해 전체 들여쓰기 및 분기 형식을 제거할 수 있다고 생각합니다 diff.

-i는
트리가 들여쓰기 행을 인쇄하지 않도록 하며, -f 옵션과 함께 사용하면 유용합니다. -J 또는 -x 옵션과 함께 사용하면 가능한 한 많은 공백도 제거됩니다.

$ tree --charset=ascii -afi .
.
./bar
./bar/babushka
./bar/galeda
./bar/helga
./foo
./foo/alpha
./foo/beta
./foo/gamma
./zebra

8 directories, 1 file

안타깝지만 들여쓰기를 사용하면 시각적으로 더 빠르게 이해할 수 있습니다. 하지만 아 글쎄…

답변3

각 줄에서 첫 번째 줄 앞의 모든 내용을 .공백으로 변환합니다.

tree --charset=ascii -af . | awk 'BEGIN{FS=OFS="."} {gsub(/./, " ", $1)} 1'

관련 정보