나는 이것이 초보적인 질문이라는 것을 알고 있습니다. 하지만 누군가는 이에 대해 짧은 대답을 할 수도 있습니다. 내 폴더에는 .로 끝나지만 다른 결말로 끝나는 파일이 여러 개 있습니다 .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을 사용하고 싶어합니다. 그러나 파일에 파일 이름을 추가하는 몇 가지 방법은 다음과 같습니다.
간단하지만 파일 이름의 줄 바꿈을 처리할 수 없습니다.
printf '%s\n' *.SAFE > filenames.txt
더 복잡하지만 임의의 파일 이름을 처리할 수 있습니다.
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
완료됩니다.