Bash显示已修改的普通文件

时间:2015-03-23 01:12:08

标签: bash

我不确定在当前会话中显示所有已修改文件的正确命令是什么?这是我的想法,但我收到错误。

alias display="ls -t | head -n *" 

2 个答案:

答案 0 :(得分:0)

head -n *

将本地目录中所有文件的列表附加到head -n命令,因此它看起来像这样:

head -n a.txt b.txt c.txt

但是-n需要一个数字,即要打印的行数。所以当它获得a.txt时,它会失败。如果要打印最年轻的文件,例如10个文件,您需要的命令是:

ls -t | head -n 10 --

如果您希望按创建日期的顺序排列每个文件的前10行,则需要:

for f in $(ls -t); do head -n 10 $f; done

如果你想要别的东西,你需要告诉我们。

答案 1 :(得分:0)

您的问题有点不清楚,但我收集的解释是,您希望找到一种方法来识别您当前用户会话中创建或修改的文件(即“自您登录以来'”)。问题本身有些涉及,但您需要做的第一件事是确定您何时登录。

last命令将显示/var/log/wtmp以获取该信息。关键是使用still logged on字段,并以一种格式获取日期,以确定自登录以来哪些文件已更改。一种方法是:

date -d "$(last $USER | grep still | head -n1 | cut -c 40-55)" "+%Y%m%d%H%M"

捕获该信息,以便以对touch命令有用的格式在变量中使用:

logontm=$(date -d "$(last $USER | grep still | head -n1 | cut -c 40-55)" "+%Y%m%d%H%M")

使用登录的日期/时间以及当前格式的日期,您可以将该日期传递给touch以使用上次登录的创建/修改时间创建临时文件:

touch -t $logontm /tmp/tmp.$logontm

如果文件具有上次登录的创建/修改时间,则可以使用find命令查找自登录以来已创建或更改的所有文件:

find /path/to/check -newer /tmp/tmp.$logontm

您可以将/path/to/check定制到您感兴趣的文件系统的相关区域。您还可以定制find命令以限制所选文件的类型。 (例如,为常规文件添加-type f)对于主目录下的所有文件,您可以将$HOME替换为/path/to/check。保存结果或根据需要使用它们。然后只需删除tmp文件:

rm /tmp/tmp.$logontm

现在已经获得批准,可能还有其他方法可以解决这个问题,您可以将所有这些放在一个命令中,但是现在我无法想到另一种获取所有新/已更改文件的方法为一个会议。如果要将所有命令组合在一起,则类似于以下内容,以检查home目录中是否有会话的新文件和已更改文件(为了便于阅读,显示为line continuations):

logontm=$(date -d "$(last $USER | grep still | head -n1 | cut -c 40-55)" "+%Y%m%d%H%M") && \
touch -t $logontm /tmp/tmp.$logontm && \
find $HOME -newer /tmp/tmp.$logontm && \
rm /tmp/tmp.$logontm

注意:,具体取决于您系统上last的版本/实施,您可能需要调整cut命令以确保您收集正确的登录日期/时间。