我必须编写一个shell脚本,该脚本应该将最新文件复制到目标目录中。我使用以下shell命令。
find . -type f -daystart -mtime -$dateoffset
它为我提供了最新的文件集。但我需要从该列表中获取最新文件并将其复制到目标目录。
感谢。
答案 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。:如果文件名中有空格,这又会遇到解析问题。但是在我们想出更有创意的东西之前你可以使用它!