대부분 이해하는 간단한 스크립트가 있습니다. 불분명 한 것은 찾기 명령입니다. 나는 많은 문서를 가지고 있지만 그것을 훨씬 더 명확하게하는 데 도움이되지 않습니다. 내 생각에는 for-loop처럼 작동하고 현재 발견 된 파일은 {}로 교체되고 $ HOME / $ dir_name에 복사되지만 -path -prune -o 작동합니까? 이렇게 구체적이고 관련성이 높은 문서를 가지고 있는데도 여전히 “무슨 일이 일어나고 있는지 알지 못하는 것은 성가신 일입니다.

#!/bin/bash # The files will be search on from the user"s home # directory and can only be backed up to a directory # within $HOME read -p "Which file types do you want to backup " file_suffix read -p "Which directory do you want to backup to " dir_name # The next lines creates the directory if it does not exist test -d $HOME/$dir_name || mkdir -m 700 $HOME/$dir_name # The find command will copy files that match the # search criteria ie .sh . The -path, -prune and -o # options are to exclude the backdirectory from the # backup. find $HOME -path $HOME/$dir_name -prune -o \ -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; exit 0 

이것은 내가해야 할 문서 일뿐입니다. 이것을 알아낼 수 있습니다.

-path 패턴

파일 이름이 쉘 패턴 패턴과 일치합니다. 메타 문자는 / 또는 . 을 특별히 처리하지 않습니다. 예를 들어 find. -path “./sr*sc”는 ./ src / misc (존재하는 경우)라는 디렉토리에 대한 항목을 인쇄합니다. 전체 디렉토리 트리를 무시하려면 트리의 모든 파일을 확인하는 대신 -prune을 사용하십시오. 예를 들어 src / emacs 디렉토리와 그 아래에있는 모든 파일 및 디렉토리를 건너 뛰고 발견 된 다른 파일의 이름을 인쇄하려면 다음과 같이하십시오.

find . -path ./src/emacs -prune -o -print

From Findutils 설명서

-작업 : -exec 명령; -execdir 작업의이 안전하지 않은 변형은 POSIX에 의해 지정됩니다. 가장 큰 차이점은 find 가 호출 된 디렉토리에서 명령이 실행된다는 것입니다. 즉, {} 이 다음 중 하나의 이름으로 시작하는 상대 경로로 확장됩니다. 일치하는 파일의 기본 이름이 아닌 시작 디렉터리입니다.

find 의 일부 구현은 {} 이 자체적으로 나타나는 경우에만 대체합니다. 인수에서 GNU find {} 이 나타날 때마다 대체합니다.

그리고

예를 들어, 현재 디렉토리 내부 또는 아래의 각 C 헤더 파일을 / tmp / master 파일과 비교하려면 :

 find . -name "*.h" -execdir diff -u "{}" /tmp/master ";" 

댓글

  • find : prune은 지정된 경로를 무시하지 않습니다.
  • ' find-path 설명 find : prune의 대답이 지정된 p를 무시하지 않더라도 ath 는이 질문에 적용되는 답을 가지고 있습니다. 스크립팅에 익숙한 사람에게는 찾기 경로 설명 답변이 의미가있을 수 있지만 ' 저를 도와주지 않습니다. 여기에있는 답변은 지금까지 더 이해하기 쉽습니다. 비록 제가 ' 지금 막 조사하기 시작했지만

답변

-path-name와 똑같이 작동하지만 패턴을 마지막 구성 요소가 아닌 검사중인 파일의 전체 경로 이름입니다.

-prune는 발견 된 파일이 디렉토리 인 경우 아래로 내려가는 것을 금지합니다.

p>

모두 합치면 명령

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; 
  1. $HOME.
  2. $HOME/$dir_name와 일치하는 파일을 찾으면 그 아래로 이동하지 않습니다 (하위 디렉토리를 “자르기”).
  3. 그렇지 않으면 (-o) *$file_suffix와 일치하는 파일을 찾으면 $HOME/$dir_name/에 복사합니다.

li>

아이디어는 하위 디렉토리에있는 $HOME의 일부 콘텐츠를 백업하는 것 같습니다. $HOME의 토리. -prune가있는 부분은 백업 백업을 피하기 위해 분명히 필요합니다 …

댓글

  • 내가 이해한다면 : find는 들어갈 권한이있는 $ HOME의 모든 디렉토리를 반복합니다. 단 $ HOME / $ dir_name은 아래로 내려 가지 않습니다 (prune 작업은 true로 평가되고 또는 가져 오지 않음), $ file_suffix로 끝나는 파일을 검색합니다. 그런 다음 하나를 찾으면 cp " found_file.sh "를 $ HOME / $ dir_name? 또한 -path는 파일 경로를 허용하며 현재 디렉토리에서 작업하는 것이 아니라 디렉토리로 내려가는 것을 찾을 때 유용합니까?
  • 당신의 이해는 거의 입니다. 옳은. -path-name처럼 작동합니다. 파일을 선택합니다. 차이점은 -name는 패턴을 파일 이름과 일치시키는 반면 -path는 패턴을 전체 경로 이름과 일치 시킨다는 것입니다. find-maxdepth 또는 -prune 등에 의해 방지되지 않는 한 항상 하위 디렉터리로 내려갑니다.
  • 오!-path는 $ HOME / $ dir_name -prune에 적용됩니다. 그러면 ' 저를 엉망으로 만든 명령의 순서이고 -path는 prune 명령에 필요합니다. 정리 된 디렉토리의 전체 경로와 일치해야합니다.
  • @Darren I ' 확실하지 않습니다. ' 꽤 정확합니다. -path $HOME/$dir_name는 하나의 작업입니다. 현재 검사중인 파일의 경로가 $HOME/$dir_name와 일치하는지 확인하는 테스트입니다. -prune는 별도의 작업입니다. 첫 번째 댓글의 첫 번째 문장이 그 작동 방식을 정확하게 반영한다고 생각합니다.
  • 파이프처럼 보이기 위해 뭔가 빠졌을까요? -prune을 -print로 바꾸었고 이제 흐름이 명확하다고 생각합니다. find $ HOME | -path $ HOME / $ dir_name | -print

Answer

이것은 find 명령 인 -exec 문의 일부입니다.

find 명령으로 찾은 파일 / 디렉토리와 상호 작용할 수 있습니다.

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;

find $HOME는 $ HOME에서 파일 / 디렉토리 찾기를 의미합니다.

-path <some_path>를 이해하려면 `find -path` 설명

-prune를 이해하려면 https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh

-o는 OR을 의미하므로 -path <some_path> 또는 -name *$file_suffix

-exec는 명령 실행을 의미합니다.

cp {} $HOME/$dir_name/$HOME/$dir_name/

와 일치하는 모든 파일을 복사합니다.

\;-exec 명령 종료

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다