여러 수준의 중첩이 포함된 다른 디렉터리가 있는 "my_directory" 디렉터리에서 패턴별로 일부 파일을 찾아 하나씩 원격 서버에 업로드하려고 합니다. 원격 서버에서는 동일한 서버에 복사되어야 합니다.원격 상대 경로 my_directory
. 이를 위해 나는scp
나는 이것으로 시작했습니다 :
ls -al my_directory | grep "*.my_custom."
포함된 파일 중 일부가 존재하더라도 *.my_custom.
아무것도 반환하지 않습니다 .
내가 어떻게 할 수있는:
a) 일부 패턴을 통해 이러한 파일을 찾습니다.
b) bash에서 반복하여 각 항목을 변수로 참조할 수 있습니까? 그래야 다음 단계에서 서버에 업로드할 수 있습니다.
답변1
귀하의 접근 방식에는 두 가지 문제가 있습니다.
grep
grep
정규식이 필요 하지만 호출 시 와일드카드("와일드카드"라고도 함)를 사용하고 있습니다.이 둘은 다르다. glob에서는*
"모든 문자 및 모든 길이의 문자열"을 의미하고, 정규식에서는 "0개 이상의 선행 문자"를 의미*
하거나 선행 문자가 없는 경우 리터럴을 의미합니다. 대조적으로,.
glob에서는 리터럴을 의미하고.
, 정규 표현식에서는 "모든 단일 문자"를 의미합니다. 따라서grep
말 그대로 별표가 포함된 파일을 찾은 다음 단일 문자를 찾은 다음my_custom
단일 문자를 계속해서 찾으게 됩니다. 달성하려는 일치에 대해 정규식은 다음과 같습니다..*\.my_custom\.
또는 고정하지 않았으므로 간단히
\.my_custom\.
추가 처리를 위해 쉘 스크립트에서 생성된 목록을 사용하려고 합니다. @Panki가 이미 언급했듯이구문 분석되지 않은 출력
ls
이를 위해 특수 문자가 포함된 파일 이름을 우연히 발견합니다. 다행히도 glob을 사용하여 원래 시도로 돌아가서 셸에서 직접 파일을 반복할 수 있습니다.for file in *.my_custom.* do your_upload_command "$file" done
쉘 변수는
$file
큰따옴표로 묶여 있습니다. 이는 원치 않는 토큰화가 발생하지 않도록 하기 위한 것입니다. 즉, 쉘 스크립트가 파일 이름에서 공백이나 기타 특수 문자를 우연히 발견하지 않도록 하기 위한 것입니다.이 작업을 재귀적으로 수행한다고 명시했으므로 다음과 같이 쉘 스크립트를 약간만 변경하면 이를 수행할 수 있습니다.
globstar
쉘 옵션 사용, Bash v4부터 사용 가능:shopt -s globstar for file in **/*.my_custom.* do your_upload_command "$file" done
답변2
이건 통과할 수 있습니다 find
.
find my_directory -name "*.my_custom." -type f -exec scp -i {} <username>@<host>:<path>/{} \;
{}
my_directory부터 시작하여 일치하는 파일에 대한 경로를 포함합니다. exec
각 게임에 대해 실행할 명령을 지정합니다. scp
이 두 가지 점을 염두에 두고 경로를 수정할 수 있습니다 .
답변3
나는 이렇게 할 것이다(GNU 시스템에서):
(cd my_directory && find . -name '*.my_custom.*' -type f -print0) |
tar --null -T - -cf - | gzip -1 | ssh host 'cd my_directory && tar zxf -'