23

到目前为止我尝试了什么...

命令:

find . -type f -ctime -3 | tail -n 5

结果:

./Mobilni Telefoni/01. Box Update/05. DC Unlocker Client/dc-unlocker_client-1.00.0857.exe
./Mobilni Telefoni/01. Box Update/39. Z3X Box/01. Update/01. Samsung Box/SamsungTool_12.4.exe
./Mobilni Telefoni/10. Nokia/1. SRPSKI  HRVATSKI  JEZICI/BB5/3xx_Series/Asha 300/06.97/rm781_06.97_ppm_d.rar
./GPS Navigacije/01. Garmin/03. Garmin Other/garmin_kgen_15.exe
./GPS Navigacije/01. Garmin/03. Garmin Other/test.txt

这个输出没问题,如果我放宽时间跨度就不行了。(注意我使用 -ctime 而不是 -mtime 因为一些上传的文件是几年前修改的)

问题是文件可以每月上传一次,或者一年一次,我仍然需要获取 10 个最新文件,无论时间跨度如何。

如果无法完成,则tail仅限制输出,或者以某种方式仅获取指定的数字,而不会对大量文件产生巨大的性能影响。

通过使用 SO 上的一个答案中的命令,我能够获取文件,但缺少一些文件......

find . -type f -printf '%T@ %p\n' | sort -n | tail -10 | cut -f2- -d" "

结果:

./Mobilni Telefoni/11. Samsung/1. FLASH FILES/1. SRPSKI HRVATSKI JEZICI/E/E2330/E2330_OXFKE2.rar
./Mobilni Telefoni/11. Samsung/1. FLASH FILES/1. SRPSKI HRVATSKI JEZICI/E/E2330/FlashTool_E2_R6.zip
./Mobilni Telefoni/11. Samsung/1. FLASH FILES/1. SRPSKI HRVATSKI JEZICI/E/E210/E210_XFGH2.rar
./Mobilni Telefoni/05. iPhone/07. iFaith/iFaith-v1.4.1_windows-final.zip
./Mobilni Telefoni/05. iPhone/09. iPhone Browser/SetupiPhoneBrowser.1.93.exe
./Mobilni Telefoni/05. iPhone/10. iPhone_PC_Suite/iPhone_PC_Suite_Eng_v0.2.1.rar
./Mobilni Telefoni/05. iPhone/10. iPhone_PC_Suite/iPhone_PC_Suite_Ok.rar
./test
./Mobilni Telefoni/11. Samsung/1. FLASH FILES/1. SRPSKI HRVATSKI JEZICI/E/E2152/E2152_XXJH4_OXFJI2.zip.filepart
./GPS Navigacije/01. Garmin/03. Garmin Other/test.txt

文件garmin_kgen_15.exe丢失,因为它是在 2008 年创建的,但它是在过去 24 小时内上传的。

4

3 回答 3

42

有人告诉我这是解决方案:

find . -type f -printf "%C@ %p\n" | sort -rn | head -n 10

关键是printf%C@占位符,就是那个-ctime。我通过阅读找到了它man find

结果:

1336992789.0000000000 ./Mobilni Telefoni/05. iPhone/03. iPhone 4G Firmware/5.1.1/iPhone3,1_5.1.1_9B206_Restore.ipsw.filepart
1336928538.0000000000 ./GPS Navigacije/01. Garmin/03. Garmin Other/test.txt
1336922295.0000000000 ./GPS Navigacije/01. Garmin/03. Garmin Other/garmin_kgen_15.exe
1336868365.0000000000 ./Mobilni Telefoni/11. Samsung/1. FLASH FILES/1. SRPSKI HRVATSKI JEZICI/E/E2152/E2152_XXJH4_OXFJI2.zip.filepart
1336867426.0000000000 ./Mobilni Telefoni/11. Samsung/1. FLASH FILES/1. SRPSKI HRVATSKI JEZICI/E/E210/E210_XFGH2.rar
1336866301.0000000000 ./Mobilni Telefoni/11. Samsung/1. FLASH FILES/1. SRPSKI HRVATSKI JEZICI/E/E2330/FlashTool_E2_R6.zip
1336865921.0000000000 ./Mobilni Telefoni/11. Samsung/1. FLASH FILES/1. SRPSKI HRVATSKI JEZICI/E/E2330/E2330_OXFKE2.rar
1336865409.0000000000 ./Mobilni Telefoni/11. Samsung/1. FLASH FILES/1. SRPSKI HRVATSKI JEZICI/E/E2230/E2230_XXKC1_CDS.zip
1336865398.0000000000 ./Mobilni Telefoni/11. Samsung/1. FLASH FILES/1. SRPSKI HRVATSKI JEZICI/E/E2230/E2230_XXKC1_BIN.zip
1336864949.0000000000 ./Mobilni Telefoni/11. Samsung/1. FLASH FILES/1. SRPSKI HRVATSKI JEZICI/E/E2230/E2230_OXFKC1_CSC.zip

对于非常大的文件列表,sort(1)使用管道可能不是资源使用的最佳选择。

sort(1)只能替换为perl(1)并缓冲前十个最高条目。这已在unix 命令中进行了概述:如何获取三个前 n 条记录,这里采用十条记录。

它取代了sort(1)andhead(1)过滤器:

find . -type f -printf "%C@ %p\n" | perl -ane '
    BEGIN {@top = ([-1]) x 10}
    if ($F[0] > $top[0][0]) {
        @top = sort {$a->[0] <=> $b->[0]} @top[1..9], [$F[0], $_];
    }
    END {print for reverse map {$_->[1]} @top}
'

结果是一样的。

于 2012-05-14T09:35:52.503 回答
0

我需要一个解决方案来获取目录中 x 最新修改的文​​件,然后在循环中使用它来进一步处理它们:

find "/mnt/user/Movie" -iname '*.mkv' -printf "%C@ %p\n" | sort -n | cut -f2- -d" " | tail -10 | tr '\n' '\0' | 
    while IFS= read -r -d '' file; do 
        echo "$file"
    done

返回:

/mnt/user/Movie/IJ/I (2014)/I (2014).mkv
/mnt/user/Movie/AB/B (2010)/B (2010).mkv
/mnt/user/Movie/MN/N (1993)/N (1993).mkv
/mnt/user/Movie/MN/M (2016)/M (2016).mkv
/mnt/user/Movie/KL/K (1984)/K (1984).mkv
/mnt/user/Movie/MN/M (1999)/M (1999).mkv
/mnt/user/Movie/GH/G (2014)/G (2014).mkv
/mnt/user/Movie/MN/M (2002)/M (2002).mkv
/mnt/user/Movie/AB/B (2017)/B (2017).mkv
/mnt/user/Movie/CD/D (1997)/D (1997).mkv

更改tail -10为应返回的文件数量。当然,您可以替换-iname '*.mkv'反对-type f以涵盖所有文件。

于 2020-10-13T12:47:00.247 回答
-4

更轻松:

filename=$(ls -t . | head -10)
于 2013-07-29T07:30:03.833 回答