0

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

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

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

谢谢。

4

5 回答 5

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 调用的二进制文件。)

于 2012-06-08T04:09:10.650 回答
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)"
于 2012-06-08T03:18:14.797 回答
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
于 2012-06-08T03:19:32.850 回答
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 仅存在于 GNU 风格的 find 中,而 -mtime 是一个更通用的命令。

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

于 2012-06-08T10:30:08.850 回答
0

如果您使用带有 -lt 选项的 ls 命令,那么它会在顶部为您提供最新的文件。所以使用这个你可以很容易地提取最新的文件名

于 2012-06-08T08:53:40.660 回答