Linux find命令,无论时间跨度如何,递归查找10个最新文件

时间:2012-05-13 22:12:38

标签: linux find tail

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

命令:

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小时内上传的。

3 个答案:

答案 0 :(得分:39)

我被告知这是解决方案:

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

答案 1 :(得分: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,以覆盖所有文件。

答案 2 :(得分:-3)

更容易:

filename=$(ls -t . | head -10)