특정 결말을 가진 모든 파일을 포함하는 텍스트 파일을 생성하는 bash 스크립트

특정 결말을 가진 모든 파일을 포함하는 텍스트 파일을 생성하는 bash 스크립트

나는 이것이 초보적인 질문이라는 것을 알고 있습니다. 하지만 누군가는 이에 대해 짧은 대답을 할 수도 있습니다. 내 폴더에는 .로 끝나지만 다른 결말로 끝나는 파일이 여러 개 있습니다 .SAFE. 각 줄이 이 파일 중 하나인 파일을 만들고 싶습니다 .txt. 나중에 .txt해당 파일을 입력으로 사용하는 프로그램을 실행하고 싶습니다 . 나는 하나의 bash 스크립트에서 이 모든 작업을 수행하고 싶습니다. 다소 다음과 같습니다.

programm.sh
####
1. get all files with .SAFE-ending
2. make a file called files.txt
3. run <some_program> 

내 폴더는 다음과 같습니다

files.txt
S2A_MSIL1C_20200418T101031_N0209_R022_T32UPB_20200418T122607.SAFE
S2A_MSIL1C_20200418T101031_N0209_R022_T32UQB_20200418T122607.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UPB_20200421T111956.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UPB_20200421T122440.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UQB_20200421T111956.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UQB_20200421T122440.SAFE
S2A_MSIL1C_20200424T103021_N0209_R108_T32UPB_20200424T124310.SAFE
S2A_MSIL1C_20200428T101031_N0209_R022_T32UPB_20200428T111417.SAFE
S2A_MSIL1C_20200428T101031_N0209_R022_T32UQB_20200428T111417.SAFE
S2A_MSIL2A_20200418T101031_N9999_R022_T32UPB_20200430T165258.SAFE

그것은 다음과 같습니다 files.txt: (파이썬에서 내가 만든 것)

2A_MSIL1C_20200418T101031_N0209_R022_T32UPB_20200418T122607.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UPB_20200421T122440.SAFE
S2B_MSIL1C_20200426T101549_N0209_R065_T32UPB_20200426T131809.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UQB_20200421T111956.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UPB_20200421T111956.SAFE
S2B_MSIL1C_20200423T100549_N0209_R022_T32UQB_20200423T135558.SAFE
S2B_MSIL1C_20200423T100549_N0209_R022_T32UPB_20200423T135558.SAFE
S2A_MSIL1C_20200428T101031_N0209_R022_T32UQB_20200428T111417.SAFE
S2B_MSIL1C_20200426T101549_N0209_R065_T32UQB_20200426T131809.SAFE
S2A_MSIL1C_20200421T102021_N0209_R065_T32UQB_20200421T122440.SAFE
S2A_MSIL1C_20200424T103021_N0209_R108_T32UPB_20200424T124310.SAFE
S2B_MSIL1C_20200419T102549_N0209_R108_T32UPB_20200419T124956.SAFE
S2A_MSIL1C_20200428T101031_N0209_R022_T32UPB_20200428T111417.SAFE
S2A_MSIL1C_20200418T101031_N0209_R022_T32UQB_20200418T122607.SAFE                                                                                                                                                  

그런 다음 parallel -j4 <some_programm> :::: files.txt명령줄에서 실행합니다.

이것은 모두 작동하지만 모든 것을 하나로 모으고 싶습니다 bash script. 한 가지 이유는 쉘 스크립팅을 배우고 싶기 때문입니다.

어떤 조언이라도 감사하겠습니다 :)

답변1

parallel로 끝나는 모든 파일에 대해 명령을 사용하고 실행 하려면 .SAFE다음이 필요합니다.

parallel -j4 <some_program> ::: *.SAFE

또는 파일 이름에 가 포함될 수 있는 경우 다음을 \n사용하세요 -0.

parallel -j4 -0 <some_program> ::: *.SAFE

파일 이름을 파일에 저장하는 것은 좋은 접근 방식이 아닙니다. 우선, 파일 이름에 \n(개행) 문자가 포함될 수 있는 경우 파일을 공백으로 구분하지 않으면 파일 이름이 깨집니다. 일반적으로 대신 glob을 사용하고 싶어합니다. 그러나 파일에 파일 이름을 추가하는 몇 가지 방법은 다음과 같습니다.

  1. 간단하지만 파일 이름의 줄 바꿈을 처리할 수 없습니다.

    printf '%s\n' *.SAFE > filenames.txt
    
  2. 더 복잡하지만 임의의 파일 이름을 처리할 수 있습니다.

    find . -type f -name '*.SAFE' -print0 > filenames
    

    이렇게 하면 NULL로 구분된 파일이 생성되므로 이러한 입력을 처리할 수 있는 도구가 필요합니다. parallel당신은 이것을 할 수 있습니다 -0:

    parallel -0 -j4 <some_program> :::: filenames
    

따라서 이 접근 방식을 사용하면 스크립트는 다음과 같을 수 있습니다.

#!/bin/sh
find . -type f -name '*.SAFE' -print0 > filenames
parallel -0 -j4 <some_program> :::: filenames

그러나 파일 이름에 공백, 줄바꿈 또는 기타 이상한 문자가 없으면 그냥 실행하면 parallel -j4 -0 <some_program> ::: *.SAFE완료됩니다.

관련 정보