我必须编写一个 shell 脚本,将最新的文件复制到目标目录中。我使用以下 shell 命令。
find . -type f -daystart -mtime -$dateoffset
它给了我最新的文件集。但我需要从该列表中获取最新文件并将其复制到目标目录。
谢谢。
我想不出在 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 调用的二进制文件。)
更新: 推荐@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)"
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
你可以使用这样的东西:
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:如果文件名中有空格,这又会遇到解析问题。但是在我们想出更有创意的东西之前,你可以使用它!
如果您使用带有 -lt 选项的 ls 命令,那么它会在顶部为您提供最新的文件。所以使用这个你可以很容易地提取最新的文件名