如何使用unix shell命令复制在给定日期修改的最新文件?

时间:2012-06-08 03:14:10

标签: shell unix

我必须编写一个shell脚本,该脚本应该将最新文件复制到目标目录中。我使用以下shell命令。

find . -type f -daystart -mtime -$dateoffset

它为我提供了最新的文件集。但我需要从该列表中获取最新文件并将其复制到目标目录。

感谢。

5 个答案:

答案 0 :(得分:3)

我无法想到在Bourne shell中执行此操作的方法,因为您需要使用实际读取日期戳并对其进行排序的工具,而Bourne shell不会这样做。

但这是PHP的解决方案:

<?php
$fdate=array();
foreach(glob("*") as $filename)
  $fdate[filemtime($filename)]=$filename;
krsort($fdate);
print "Newest item: " . reset($fdate) . "\n";'
?>

如果你喜欢使用 bash 而不是Bourne,那么他就是一种使用关联数组获得你想要的东西的方法:

#!/usr/local/bin/bash

declare -A fdate

highest=0
for file in *; do
  timestamp=$(stat -f '%m' "$file")
  fdate[$timestamp]="$file"
  if [ "$timestamp" -gt "$highest" ]; then
    highest=$timestamp
  fi
done

printf "Newest file: %s\n" "${fdate[$highest]}"

请注意我使用的是FreeBSD,所以这个解决方案也适用于OSX,但是如果你碰巧使用Linux,你需要弄清楚stat命令的实现与我的不同。 (提示:您可以使用stat -c '%y',但man stat可以确定.Solaris,HP / UX,OSF / 1等似乎不包含stat二进制文件从你的shell调用。)

答案 1 :(得分:2)

更新: @ ghoti建议使用这个解决方案。以下证明是非鲁莽的。它留在这里只是因为,作为部分答案,它可能指向更好的单线解决方案。

ls -1dt $(find . -type f -daystart -mtime -$dateoffset) | head -n1

将文件复制到$ TARGET_DIR,

A=$(ls -1dt $(find . -type f -daystart -mtime -$dateoffset) | head -n1)
if [ -n "$A" ] cp -u "$A" "$TARGET_DIR/$(basename $A)"

答案 2 :(得分:1)

find . -name "*" -type f -daystart -mtime -$dateoffset | xargs -i mv {} /where/to/put/files

mv `find . -name "*" -type f -daystart -mtime -$dateoffset` /where/to/put/files

答案 3 :(得分:0)

如果你使用ls命令和-lt选项,它会在顶部给你最新的文件。 因此,使用此功能可以轻松提取最新文件名

答案 4 :(得分:0)

您可以使用以下内容:

find . -type f -name "*" -mtime +x_NUMBER_OF_DAYS|ls -lrt|awk -F' ' '{print $(COLUMN_NUMBER_IN_WHICH_FILE_NAME_APPEARS)}'|tail -1 

这将在给定日期之前为您提供最新文件。

正如有人建议的那样,daystart只存在于find的GNU风格中,而-mtime是一个更通用的命令。

P.S。:如果文件名中有空格,这又会遇到解析问题。但是在我们想出更有创意的东西之前你可以使用它!