Bash 列出具有特定名称范围的文件
Bash list files with certain name range
我有一个目录,其中包含具有唯一时间的 txt 文件,这些文件是在一夜之间生成的。鉴于文件中的唯一时间戳,我试图列出这些文件。
文件名的一些示例如下:
file_20210122_1130_1.txt
file_20210122_1133_1.txt
file_20210122_1221_1.txt
file_20210122_1342_1.txt
file_20210122_1721_1.txt
file_20210122_1911_1.txt
file_20210122_2009_1.txt
file_20210122_2020_1.txt
file_20210122_2130_1.txt
...
我希望能够列出 1900 年到 2100 年之间的文件(使用文件名本身包含的模式),它应该列出以下内容:
file_20210122_1911_1.txt
file_20210122_2009_1.txt
file_20210122_2020_1.txt
我正在尝试使用下面的代码片段,但它部分有效并且没有列出所有文件。
cd /home/somedir/files;
ls *.txt | awk '/1900/,/2100/'
如有任何帮助,我们将不胜感激。
如果文件名的格式相同,你可以使用awk并将字段分隔符设置为_
然后检查第3个字段是否在1900和2100之间
ls -A1 *.txt | awk -v FS=_ ' >= 1900 && <= 2100'
输出
file_20210122_1911_1.txt
file_20210122_2009_1.txt
file_20210122_2020_1.txt
鉴于:
$ ls -1
file_20210122_1130_1.txt
file_20210122_1133_1.txt
file_20210122_1221_1.txt
file_20210122_1342_1.txt
file_20210122_1721_1.txt
file_20210122_1911_1.txt
file_20210122_2009_1.txt
file_20210122_2020_1.txt
file_20210122_2130_1.txt
你可以得到clean filenames using printf
and a glob then use a regex来过滤结果:
printf "%s\n" file_*.txt | ggrep -oP 'file_\d{8}_(?:19\d\d|20\d\d|2100)_\d\.txt'
file_20210122_1911_1.txt
file_20210122_2009_1.txt
file_20210122_2020_1.txt
不解析 ls
的输出。
$ shopt -s nullglob
$ printf '%s\n' *_{1900..2100}_*.txt
file_20210122_1911_1.txt
file_20210122_2009_1.txt
file_20210122_2020_1.txt
感谢大家的回复。我使用了@the-fourth-bird 和@dawg 的答案并对其进行了调整以使其适合我。
我使用了以下内容:
printf "%s\n" file_*.txt
列出所有文件,然后是以下内容:
awk -v a="$start" -v b="$stop" 'BEGIN {FS="_"}; {if( >= a && <= b) print}'
获取 1900(开始)和 2100(停止)之间的文件
最后的命令是:
printf "%s\n" file_*.txt | awk -v a="$start" -v b="$stop" 'BEGIN {FS="_"}; {if( >= a && <= b) print}';
它给出了(我想要的)的输出:
file_20210122_1911_1.txt
file_20210122_2009_1.txt
file_20210122_2020_1.txt
感谢您的帮助!
我有一个目录,其中包含具有唯一时间的 txt 文件,这些文件是在一夜之间生成的。鉴于文件中的唯一时间戳,我试图列出这些文件。 文件名的一些示例如下:
file_20210122_1130_1.txt
file_20210122_1133_1.txt
file_20210122_1221_1.txt
file_20210122_1342_1.txt
file_20210122_1721_1.txt
file_20210122_1911_1.txt
file_20210122_2009_1.txt
file_20210122_2020_1.txt
file_20210122_2130_1.txt
...
我希望能够列出 1900 年到 2100 年之间的文件(使用文件名本身包含的模式),它应该列出以下内容:
file_20210122_1911_1.txt
file_20210122_2009_1.txt
file_20210122_2020_1.txt
我正在尝试使用下面的代码片段,但它部分有效并且没有列出所有文件。
cd /home/somedir/files;
ls *.txt | awk '/1900/,/2100/'
如有任何帮助,我们将不胜感激。
如果文件名的格式相同,你可以使用awk并将字段分隔符设置为_
然后检查第3个字段是否在1900和2100之间
ls -A1 *.txt | awk -v FS=_ ' >= 1900 && <= 2100'
输出
file_20210122_1911_1.txt
file_20210122_2009_1.txt
file_20210122_2020_1.txt
鉴于:
$ ls -1
file_20210122_1130_1.txt
file_20210122_1133_1.txt
file_20210122_1221_1.txt
file_20210122_1342_1.txt
file_20210122_1721_1.txt
file_20210122_1911_1.txt
file_20210122_2009_1.txt
file_20210122_2020_1.txt
file_20210122_2130_1.txt
你可以得到clean filenames using printf
and a glob then use a regex来过滤结果:
printf "%s\n" file_*.txt | ggrep -oP 'file_\d{8}_(?:19\d\d|20\d\d|2100)_\d\.txt'
file_20210122_1911_1.txt
file_20210122_2009_1.txt
file_20210122_2020_1.txt
不解析 ls
的输出。
$ shopt -s nullglob
$ printf '%s\n' *_{1900..2100}_*.txt
file_20210122_1911_1.txt
file_20210122_2009_1.txt
file_20210122_2020_1.txt
感谢大家的回复。我使用了@the-fourth-bird 和@dawg 的答案并对其进行了调整以使其适合我。
我使用了以下内容:
printf "%s\n" file_*.txt
列出所有文件,然后是以下内容:
awk -v a="$start" -v b="$stop" 'BEGIN {FS="_"}; {if( >= a && <= b) print}'
获取 1900(开始)和 2100(停止)之间的文件
最后的命令是:
printf "%s\n" file_*.txt | awk -v a="$start" -v b="$stop" 'BEGIN {FS="_"}; {if( >= a && <= b) print}';
它给出了(我想要的)的输出:
file_20210122_1911_1.txt
file_20210122_2009_1.txt
file_20210122_2020_1.txt
感谢您的帮助!