我正在尝试对" find"的结果进行排序。根据特定领域的命令。我希望"排序"有一个从最后排序的标志(从左到右有什么特别的?)
我正在生成一个文件列表,如下例所示:
find . -name "S1A*1S*SAFE"
./A/B/S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_3F8E.SAFE
./A/S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_01AD.SAFE
./A/B/C/S1A_IW_SLC__1SDV_20140525T060238_20140525T060309_000750_000B43_4EFA.SAFE
./A/S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_4073.SAFE
./A/B/C/D/S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_D26E.SAFE
我想根据第一个日期字段(例如20140523T173226)对此文件列表进行排序,但无法知道该文件的路径是什么。我想我需要以某种方式根据文件名末尾的第5个字段进行排序(可能还有另一种方法吗?)给出了一个" _"分隔符。
到目前为止,我能想到的最好的是:
find . -name "S1A*1S*SAFE" | rev | awk -F '/' '{print $1}' | rev | sort -t _ -k 5
它会反转文件名,输出所有内容,直到第一个" /"符号然后取消反向操作,然后它可以按第5个字段排序(使用" _"作为分隔符)。 它会生成:
S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_01AD.SAFE
S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_3F8E.SAFE
S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_4073.SAFE
S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_D26E.SAFE
S1A_IW_SLC__1SDV_20140525T060238_20140525T060309_000750_000B43_4EFA.SAFE
这很好 - 除了我需要为每个文件保留整个路径,并且awk在此示例中将其删除。
有没有办法调整这种方法 - 或使用完全不同的方法 - 这是我需要的吗?我是用bash做的;我不喜欢perl等,因为我无法控制我们IT团队安装的内容等。(bash是可靠的)。
答案 0 :(得分:1)
肮脏而快速的解决方案是:
进行测试,我将find
输出保存到名为f
的文件中,您可以使用find
kent$ cat f
./A/B/S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_3F8E.SAFE
./A/S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_01AD.SAFE
./A/B/C/S1A_IW_SLC__1SDV_20140525T060238_20140525T060309_000750_000B43_4EFA.SAFE
./A/S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_4073.SAFE
./A/B/C/D/S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_D26E.SAFE
kent$ awk -F_ '$0=$(NF-4)"\x99"$0' f |sort|sed 's/.*\x99//'
./A/B/S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_3F8E.SAFE
./A/S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_01AD.SAFE
./A/B/C/D/S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_D26E.SAFE
./A/S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_4073.SAFE
./A/B/C/S1A_IW_SLC__1SDV_20140525T060238_20140525T060309_000750_000B43_4EFA.SAFE
答案 1 :(得分:1)
不完全漂亮,但确实有效。使用 / 作为输出分隔符,因为我们知道它不会显示在$NF
的值中。
find . -name "S1A*1S*SAFE" | awk -F/ '{print $NF"/"$0}' | sort -t_ -k 5,5 | cut -d/ -f 2-
答案 2 :(得分:1)
find ... | awk -F_ '{print $(NF-4) "\t" $0}' | sort -k1 | cut -f2-
上面只是将_
- 分隔的第5个结尾字符串(您关注的日期)复制到该行的前面,后跟一个制表符,然后使用该字符串进行排序,然后将其删除awk添加的字段加标签。
使用cat file
仅为此示例复制find
输出(通常不会将文件写入awk):
$ cat file
./A/B/S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_3F8E.SAFE
./A/S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_01AD.SAFE
./A/B/C/S1A_IW_SLC__1SDV_20140525T060238_20140525T060309_000750_000B43_4EFA.SAFE
./A/S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_4073.SAFE
./A/B/C/D/S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_D26E.SAFE
$
$ cat file | awk -F_ '{print $(NF-4) "\t" $0}'
20140512T054812 ./A/B/S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_3F8E.SAFE
20140512T054812 ./A/S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_01AD.SAFE
20140525T060238 ./A/B/C/S1A_IW_SLC__1SDV_20140525T060238_20140525T060309_000750_000B43_4EFA.SAFE
20140523T173226 ./A/S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_4073.SAFE
20140523T173226 ./A/B/C/D/S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_D26E.SAFE
$
$ cat file | awk -F_ '{print $(NF-4) "\t" $0}' | sort -k1
20140512T054812 ./A/B/S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_3F8E.SAFE
20140512T054812 ./A/S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_01AD.SAFE
20140523T173226 ./A/B/C/D/S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_D26E.SAFE
20140523T173226 ./A/S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_4073.SAFE
20140525T060238 ./A/B/C/S1A_IW_SLC__1SDV_20140525T060238_20140525T060309_000750_000B43_4EFA.SAFE
$
$ cat file | awk -F_ '{print $(NF-4) "\t" $0}' | sort -k1 | cut -f2-
./A/B/S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_3F8E.SAFE
./A/S1A_IW_SLC__1SDH_20140512T054812_20140512T054842_000560_000716_01AD.SAFE
./A/B/C/D/S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_D26E.SAFE
./A/S1A_IW_SLC__1SDV_20140523T173226_20140523T173256_000728_000A3A_4073.SAFE
./A/B/C/S1A_IW_SLC__1SDV_20140525T060238_20140525T060309_000750_000B43_4EFA.SAFE