Bash

用於創建包含具有特定結尾的所有文件的文本文件的 bash 腳本

  • May 6, 2020

我知道這是一個該死的初學者問題。但也許有人對此有一個簡短的回答。在我的文件夾中,我有幾個以.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。不過,這裡有幾種將文件名放入文件的方法:

  1. 簡單,但不能處理文件名中的換行符:
printf '%s\n' *.SAFE > filenames.txt
  1. 更複雜,但可以處理任意文件名:
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並完成它。

引用自:https://unix.stackexchange.com/questions/583610