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
:(只是我用python創建的)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
。原因之一是,我想學習一些 shell 腳本。我很感謝任何建議:)
如果您想
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
並完成它。