Linux按月和年排序

  • 本文关键字:排序 Linux linux
  • 更新时间 :
  • 英文 :


我正试图按日期排序此数据,如2020年10月30日列,但我不确定如何

这是我当前的命令

sudo find / -maxdepth 4 -size +1M  -exec ls -lh {} ; | sort -k 6hr

这是我的输出

-rw-r--r-- 1 root root 80M Oct 30  2020 /usr/lib/x86_64-linux-gnu/libLLVM-11.so.1
-rw-r--r-- 1 root root 38M Aug 27 13:02 /var/cache/apt/srcpkgcache.bin
-rw-r--r-- 1 root root 38M Sep  6 15:57 /var/cache/apt/pkgcache.bin
-rw-r--r-- 1 root root 27M Mar 17  2020 /usr/lib/x86_64-linux-gnu/libicudata.so.66.1
-rwxr-xr-x 1 root root 27M Feb  2  2021 /usr/lib/snapd/snapd
-rwxr-xr-x 1 root root 23M Feb  2  2021 /usr/bin/snap
-rwxr-xr-x 1 root root 16M Feb  2  2021 /usr/lib/snapd/snap-bootstrap
-rwxr-xr-x 1 root root 12M Feb  2  2021 /usr/lib/snapd/snap-repair
-r--r--r-- 1 root root 9.5M Feb 19  2021 /usr/lib/udev/hwdb.bin
-rw-r--r-- 1 root root 9.0M Dec 18  2020 /usr/lib/x86_64-linux-gnu/libvulkan_intel.so
-rwxr-xr-x 1 root root 8.8M Feb  2  2021 /usr/lib/snapd/snap-preseed
-rw-r--r-- 1 root root 8.7M May 29 00:49 /usr/lib/x86_64-linux-gnu/libtsan.so.0.0.0
-rwxr-xr-x 1 root root 8.7M Feb  2  2021 /usr/lib/snapd/snap-recovery-chooser
-rwxr-xr-x 1 root root 8.3M Feb  2  2021 /usr/lib/snapd/snapctl
-rw-r--r-- 1 root root 7.2M Dec 18  2020 /usr/lib/x86_64-linux-gnu/libvulkan_radeon.so
-rw-r--r-- 1 root root 6.3M Dec 16  2020 /usr/lib/x86_64-linux-gnu/libpthread.a
-rwxr-xr-x 1 root root 5.8M Feb  2  2021 /usr/lib/snapd/snap-update-ns
-rw-r--r-- 1 root root 5.6M Jan 16  2020 /usr/lib/file/magic.mgc
-rw-r--r-- 1 root root 5.5M Dec 16  2020 /usr/lib/x86_64-linux-gnu/libc.a
-rwxr-xr-x 1 root root 5.3M Jul 28  2020 /usr/bin/python3.8
-rw-r--r-- 1 root root 5.2M Jul 28  2020 /usr/lib/x86_64-linux-gnu/libpython3.8.so.1.0
-r-xr-xr-x 2 admin1 admin1 4.7M Aug 26 02:01 /mnt/c/Windows/explorer.exe
-rwxr-xr-x 1 root root 4.6M Feb  2  2021 /usr/lib/snapd/snap-failure
-rwxrwxrwx 1 admin1 admin1 4.3M Jun 28 16:08 /mnt/c/Python39/python39.dll
-rwxr-xr-x 1 root root 3.9M Feb  2  2021 /usr/lib/snapd/snap-exec
-rw-r--r-- 1 root root 3.4M Oct 19  2020 /usr/lib/x86_64-linux-gnu/libperl.so.5.30.0
-rwxr-xr-x 2 root root 3.4M Oct 19  2020 /usr/bin/perl

非常感谢!

或者对ls使用不同魔法的版本:

sudo find / -maxdepth 4 -size +1M  -exec ls -lh --time-style=long-iso {} ; | sort -k6

因为它彻底惹恼了我,ls不显示年份默认情况下,当时间戳位于过去6个月内,MMM DD YYYY对我来说没有意义,我已经导出TIME_STYLE=long-iso在我的~/.bashrc…这样更有逻辑性,更容易排序。

您可以使用所谓的装饰+排序+非装饰方法来完成此操作,其中通过在窗体yyyymmdd的末尾添加新列(新列10)来装饰每行,然后按新的最后一列排序,然后通过删除最后一列来删除(非装饰)输出。

awk是正常的选择,只要文件名不包含空格(这会使awk的列(字段)计数倾斜),这就可以很好地工作。

你可以这样做:

sudo find / -maxdepth 4 -size +1M  -exec ls -lh {} ; |
awk 'BEGIN { 
m["Jan"]=1; m["Feb"]=2; m["Mar"]=3; m["Apr"]=4; m["May"]=5; m["Jun"]=6; 
m["Jul"]=7; m["Aug"]=8; m["Sep"]=9; m["Oct"]=10; m["Nov"]=11; m["Dec"]=12} 
{
year = ($8 ~ /:/) ? 2021 : $8
mon = (length(m[$6]) < 2) ? "0"m[$6] : m[$6]
day = (length($7) < 2) ? "0"$7 : $7
$(NF+1) = year mon day
}1
' | sort -k 10 | awk '{$NF = ""}1'

上面,第一次调用awk用新的yyyymmdd列(新列(字段)10)装饰每一行,然后使用sort按字段10对结果排序。第二个awk命令取消对每一行的修饰。

使用/输出示例

将显示的输出放在文件file中,您可以将其排序为:
awk 'BEGIN { 
m["Jan"]=1; m["Feb"]=2; m["Mar"]=3; m["Apr"]=4; m["May"]=5; m["Jun"]=6; 
m["Jul"]=7; m["Aug"]=8; m["Sep"]=9; m["Oct"]=10; m["Nov"]=11; m["Dec"]=12} 
{
year = ($8 ~ /:/) ? 2021 : $8
mon = (length(m[$6]) < 2) ? "0"m[$6] : m[$6]
day = (length($7) < 2) ? "0"$7 : $7
$(NF+1) = year mon day
}1
' file | sort -k 10 | awk '{$NF = ""}1'
-rw-r--r-- 1 root root 5.6M Jan 16 2020 /usr/lib/file/magic.mgc
-rw-r--r-- 1 root root 27M Mar 17 2020 /usr/lib/x86_64-linux-gnu/libicudata.so.66.1
-rw-r--r-- 1 root root 5.2M Jul 28 2020 /usr/lib/x86_64-linux-gnu/libpython3.8.so.1.0
-rwxr-xr-x 1 root root 5.3M Jul 28 2020 /usr/bin/python3.8
-rw-r--r-- 1 root root 3.4M Oct 19 2020 /usr/lib/x86_64-linux-gnu/libperl.so.5.30.0
-rwxr-xr-x 2 root root 3.4M Oct 19 2020 /usr/bin/perl
-rw-r--r-- 1 root root 80M Oct 30 2020 /usr/lib/x86_64-linux-gnu/libLLVM-11.so.1
-rw-r--r-- 1 root root 5.5M Dec 16 2020 /usr/lib/x86_64-linux-gnu/libc.a
-rw-r--r-- 1 root root 6.3M Dec 16 2020 /usr/lib/x86_64-linux-gnu/libpthread.a
-rw-r--r-- 1 root root 7.2M Dec 18 2020 /usr/lib/x86_64-linux-gnu/libvulkan_radeon.so
-rw-r--r-- 1 root root 9.0M Dec 18 2020 /usr/lib/x86_64-linux-gnu/libvulkan_intel.so
-rwxr-xr-x 1 root root 12M Feb 2 2021 /usr/lib/snapd/snap-repair
-rwxr-xr-x 1 root root 16M Feb 2 2021 /usr/lib/snapd/snap-bootstrap
-rwxr-xr-x 1 root root 23M Feb 2 2021 /usr/bin/snap
-rwxr-xr-x 1 root root 27M Feb 2 2021 /usr/lib/snapd/snapd
-rwxr-xr-x 1 root root 3.9M Feb 2 2021 /usr/lib/snapd/snap-exec
-rwxr-xr-x 1 root root 4.6M Feb 2 2021 /usr/lib/snapd/snap-failure
-rwxr-xr-x 1 root root 5.8M Feb 2 2021 /usr/lib/snapd/snap-update-ns
-rwxr-xr-x 1 root root 8.3M Feb 2 2021 /usr/lib/snapd/snapctl
-rwxr-xr-x 1 root root 8.7M Feb 2 2021 /usr/lib/snapd/snap-recovery-chooser
-rwxr-xr-x 1 root root 8.8M Feb 2 2021 /usr/lib/snapd/snap-preseed
-r--r--r-- 1 root root 9.5M Feb 19 2021 /usr/lib/udev/hwdb.bin
-rw-r--r-- 1 root root 8.7M May 29 00:49 /usr/lib/x86_64-linux-gnu/libtsan.so.0.0.0
-rwxrwxrwx 1 admin1 admin1 4.3M Jun 28 16:08 /mnt/c/Python39/python39.dll
-r-xr-xr-x 2 admin1 admin1 4.7M Aug 26 02:01 /mnt/c/Windows/explorer.exe
-rw-r--r-- 1 root root 38M Aug 27 13:02 /var/cache/apt/srcpkgcache.bin
-rw-r--r-- 1 root root 38M Sep 6 15:57 /var/cache/apt/pkgcache.bin

注意,在find命令中使用-exec效率极低,最好使用带有可用格式说明符的-printf选项,它可以按您喜欢的任何顺序创建文件输出,并用yyyymmdd为您修饰输出。这将节省在每个文件上调用ls -lh来生成文件清单的时间。

还有其他方法可以做到这一点,所以不要认为这是唯一的方法。进一步注意,如果使用这种方法,文件名中的空白会损坏字段。

GNUdate可以解析ls打印的格式。下面的代码将日期转换为Unix历秒,并使用Schwartzian转换对行进行排序。这个转换需要四个步骤:

  1. 计算排序键
  2. 在数据前加上排序键
  3. 排序前缀数据
  4. 删除前缀
while read line; do
date=$(sed 's/  / /g' <<< "$line" | cut -d ' ' -f 6-8)
epoch=$(date -d "$date" +%s)
printf '%s %sn' "$epoch" "$line"
done | sort -n | sed 's/^[0-9]* //'

但是:为什么你不应该解析ls(1)

的输出相反,最好告诉find只打印时间和文件名。可以对其进行排序,删除排序键,最后将文件名传递给ls。但是您必须使用选项-f来保持排序顺序。
sudo find / -maxdepth 4 -size +1M -printf "%C@ %pn" | 
sort -n | 
sed 's/^[0-9.]* //' | 
xargs ls -flh

最新更新