如何在BASH中按创建日期对目录进行排序?

时间:2013-04-09 04:23:14

标签: linux bash unix-timestamp samba ext4

我正在尝试创建一个简单的脚本来列出在我的nas计算机上的目录中创建的16个最新文件夹,作为显示添加到我的集合中的最新电影的方式。

我目前使用的脚本是:

#!/bin/bash
rm -f /volume1/new-movies/*
IFS=$'\x0A'
fresh=$(ls -1ct /volume1/movies | head -16)
for folder in $fresh
do
    file=$(find "/volume1/movies/$folder" -maxdepth 1 -type f)
    movie=$(basename "$file")
    ln -s "$file" "/volume1/new-movies/$movie"
done
ls -1 /volume1/new-movies

没关系(电影文件夹只包含文件夹)。我的问题是这是按文件/文件夹修改时间而不是创建时间排序的。

文件系统是ext4并且应该支持birth time,但我没有运气访问它。

scott@pandora scripts $ stat  /volume1/movies/example/
  File: '/volume1/movies/example/'
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: 902h/2306d      Inode: 373800961   Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1028/   scott)   Gid: (  100/   users)
Access: 2013-04-09 13:39:53.243991684 +1000
Modify: 2013-04-06 13:26:00.965998952 +1100
Change: 2013-04-09 11:46:23.280991727 +1000
 Birth: -

但是,samba似乎没有显示正确的创建日期/时间的问题。有没有办法从bash访问相同的信息?或者我将不得不在python / other中编写一些东西,通过直接访问smb并使用创建日期列出每个文件夹来完成我需要的工作?

scott@pandora scripts $ smbclient \\\\localhost\\movies\\
Enter scott's password:
Domain=[EXAMPLENET] OS=[Unix] Server=[Samba 3.6.9]
smb: \> allinfo "example"
altname: E06KNE~A
create_time:    Fri Jun 18 17:23:49 2010 EST
access_time:    Tue Apr  9 13:39:53 2013 EST
write_time:     Sat Apr  6 13:26:01 2013 EST
change_time:    Sat Apr  6 13:26:01 2013 EST
attributes: DA (30)
smb: \> quit

编辑:请参阅我的以下答案,了解我对此问题的最终解决方案。

2 个答案:

答案 0 :(得分:1)

经过一番摆弄后,我提出了一个解决方案,似乎比试图依赖ls -lc更好一点。这是我现在使用的完整脚本。

#!/usr/bin/env sh

# remove the existing symbolic links-
rm -f /volume1/new-movies/*

# retrieve the folder listing from the smbclient (the date used is 'modified'
# which appears closer to 'creation' than anything else)
folders=$(smbclient \\\\localhost\\movies -N -c ls 2>/dev/null)

# format the output for better sorting. eg
# folder DA 0 Mon  2 Oct 12:23:00 2012
# 2012-Oct-2 12:23:00 "folder"
fmt1=$(echo "$folders" | sed -E 's/^  (.*\))\s+DA.* (\w+)\s+([0-9]{1,2})\s+([0-9:]{8})\s+([0-9]{4})$/\5-\2-\3 \4 "\1"/')

# change the month names to numeric representations and pad single digit
# dates to 2 characters. eg.
# 2012-Oct-2 12:23:00 "folder"
# 2012-10-02 12:23:00 "folder"
fmt2=$(echo -e "$fmt1" |sed 's/-Jan-/-01-/;s/-Feb-/-02-/;s/-Mar-/-03-/;s/-Apr-/-04-/;s/-May-/-05-/;s/-Jun-/-06-/;s/-Jul-/-07-/;s/-Aug-/-08-/;s/-Sep-/-09-/;s/-Oct-/-10-/;s/-Nov-/-11-/;s/-Dec-/-12-/;s/-\([0-9]\) /-0\1 /')

# sort the folders in reverse order
sortd=$(echo -e "$fmt2" | sort -r)

# grab the last 16. (16 items per page are displayed on the wd tv streaming)
latest=$(echo -e "$sortd" | head -16 | cut -d\" -f2)

# loop through each folder using new line rather than dft. space
IFS=$'\x0A'
for l in $latest
do
   # find the movie file in the directory, dont look in subdirectories and
   # only match movie files. skips subtitles, bonus features, etc.
   f=$(find "/volume1/movies/$l" -maxdepth 1 -type f \
   \( -iname \*.avi -o \
      -iname \*.mp4 -o \
      -iname \*.mkv -o \
      -iname \*.mpg -o \
      -iname \*.ts -o \
      -iname \*.m4v \
   \) -exec echo "{}" \;)

   # grab just the filename
   b=$(basename "$f")

   # link the file $f to the new movie folder with just the base name.
   ln -s "$f" "/volume1/new-movies/$b"

done
IFS=
ls -1 /volume1/new-movies

答案 1 :(得分:0)

Linux文件系统从未用于支持文件创建时间,但显然是ext4。它没有很好地集成在像ls和stat这样的标准工具中,但你可以以root身份执行此操作:

debugfs -R'stat /full/path/to/my/file.txt'/ dev / sda1

其中sda1是您的文件系统所在的设备