디렉터리와 모든 중첩 파일의 패턴별로 파일 목록을 가져오고 결과를 반복합니다.

디렉터리와 모든 중첩 파일의 패턴별로 파일 목록을 가져오고 결과를 반복합니다.

여러 수준의 중첩이 포함된 다른 디렉터리가 있는 "my_directory" 디렉터리에서 패턴별로 일부 파일을 찾아 하나씩 원격 서버에 업로드하려고 합니다. 원격 서버에서는 동일한 서버에 복사되어야 합니다.원격 상대 경로 my_directory. 이를 위해 나는scp

나는 이것으로 시작했습니다 :

ls -al my_directory | grep "*.my_custom."

포함된 파일 중 일부가 존재하더라도 *.my_custom.아무것도 반환하지 않습니다 .

내가 어떻게 할 수있는:

a) 일부 패턴을 통해 이러한 파일을 찾습니다.

b) bash에서 반복하여 각 항목을 변수로 참조할 수 있습니까? 그래야 다음 단계에서 서버에 업로드할 수 있습니다.

답변1

귀하의 접근 방식에는 두 가지 문제가 있습니다.

  1. grepgrep정규식이 필요 하지만 호출 시 와일드카드("와일드카드"라고도 함)를 사용하고 있습니다.이 둘은 다르다. glob에서는 *"모든 문자 및 모든 길이의 문자열"을 의미하고, 정규식에서는 "0개 이상의 선행 문자"를 의미 *하거나 선행 문자가 없는 경우 리터럴을 의미합니다. 대조적으로, .glob에서는 리터럴을 의미하고 ., 정규 표현식에서는 "모든 단일 문자"를 의미합니다. 따라서 grep말 그대로 별표가 포함된 파일을 찾은 다음 단일 문자를 찾은 다음 my_custom단일 문자를 계속해서 찾으게 됩니다. 달성하려는 일치에 대해 정규식은 다음과 같습니다.

    .*\.my_custom\.
    

    또는 고정하지 않았으므로 간단히

    \.my_custom\.
    
  2. 추가 처리를 위해 쉘 스크립트에서 생성된 목록을 사용하려고 합니다. @Panki가 이미 언급했듯이구문 분석되지 않은 출력ls이를 위해 특수 문자가 포함된 파일 이름을 우연히 발견합니다. 다행히도 glob을 사용하여 원래 시도로 돌아가서 셸에서 직접 파일을 반복할 수 있습니다.

    for file in *.my_custom.*
    do
      your_upload_command "$file"
    done
    

    쉘 변수는 $file큰따옴표로 묶여 있습니다. 이는 원치 않는 토큰화가 발생하지 않도록 하기 위한 것입니다. 즉, 쉘 스크립트가 파일 이름에서 공백이나 기타 특수 문자를 우연히 발견하지 않도록 하기 위한 것입니다.

  3. 이 작업을 재귀적으로 수행한다고 명시했으므로 다음과 같이 쉘 스크립트를 약간만 변경하면 이를 수행할 수 있습니다.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 -'

관련 정보