用于创建包含具有特定结尾的所有文件的文本文件的 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 脚本。

我很感谢任何建议:)

答案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完成。

相关内容