내가 가장 잘 이해하는 간단한 스크립트가 있지만 내가 이해하지 못하는 것은 find 명령입니다. 많은 문서가 있지만 더 명확하지는 않습니다. 내 생각은 이것이 for 루프처럼 작동하고 현재 발견된 파일이 {}로 바뀌고 $HOME/$dir_name에 복사된다는 것입니다. 하지만 검색 방법- 작은 길그리고-트림 -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 "./sr*sc"를 찾으면 다음과 같은 디렉토리에 대한 항목이 인쇄됩니다../src/기타(있는 경우). 전체 디렉토리 트리를 무시하려면 트리의 모든 파일을 확인하는 대신 -prune을 사용하십시오. 예를 들어 디렉터리를 건너뜁니다.소스/이맥스그리고 그 아래의 모든 파일과 디렉터리를 검색하고 발견된 다른 파일의 이름을 인쇄하려면 다음 작업을 수행하십시오.
find . -path ./src/emacs -prune -o -print
-- 조치: -exec 명령은 안전하지 않은 변형입니다.-execdir작업은 POSIX에 의해 지정됩니다. 가장 큰 차이점은 명령이 다음 디렉터리에서 실행된다는 것입니다.찾다불린다, 라는 뜻이다.{}파일의 기본 이름과 일치하는 것이 아니라 시작 디렉터리 중 하나의 이름으로 시작하는 상대 경로로 확장됩니다.
일부 구현이지만찾다바꾸다{}인수에서 단독으로 나타날 때만 GNU찾다바꾸다{} 어디에 나타나든 상관없습니다.
그리고
예를 들어, 현재 디렉토리 안이나 아래의 모든 C 헤더 파일을 /tmp/master 파일과 비교하려면 다음을 수행하십시오.
find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'
답변1
-path
와 정확히 동일하게 작동 -name
하지만 마지막 구성 요소 대신 확인 중인 파일의 전체 경로 이름에 패턴을 적용합니다.
-prune
디렉토리인 경우 발견된 파일 아래로 내림차순을 비활성화합니다.
그것들을 하나로 합치면, 명령은
find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
- 에서 파일 찾기를 시작하세요
$HOME
. - 일치하는 파일을 찾으면
$HOME/$dir_name
그 아래로 이동하지 않습니다(하위 디렉터리를 "자르기"). - 그렇지 않은 경우(
-o
) 일치하는 파일이 발견되면*$file_suffix
해당 파일을 에 복사합니다$HOME/$dir_name/
.
$HOME
아이디어는 $HOME
. -prune
백업의 백업을 방지하려면 다음 섹션이 필요합니다.
답변2
이는 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>
다음을 참조하세요."경로 찾기" 설명
배우려면 -prune
다음을 참조하세요.https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh
-o
OR를 의미하므로 -path <some_path>
OR-name *$file_suffix
-exec
명령 실행을 나타냅니다.
cp {} $HOME/$dir_name/
일치하는 파일을 복사하세요.$HOME/$dir_name/
\;
종료 -exec
명령을 나타냅니다.