저는 로컬 디렉터리를 동일한 디렉터리의 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'