我的目录中有 3 个 zip 文件。我想将最新版本复制到备份目录。
我的代码适用于.sh
和其他文件,但不适用于.zip
.我还有什么事情要做吗?
cp -p `ls -tr1 /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/| tail -1` /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Backup1/
它说:cp: website3.zip: No such file or directory
答案1
运行这个:
cp -p "`ls -dtr1 "$SRC_DIR"/* | tail -1`" "$DEST_DIR"
这里,ls -d
给出绝对路径。
在您的命令中,由于ls
不返回绝对路径,因此您必须从源目录运行该命令才能复制文件。当您从没有该文件的其他目录运行它时,No such file or directory
会显示错误。
另外,由于路径中有空格,我们需要引用,ls -dtr1 /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/* | tail -1
以便 shell 不会对其输出进行分词。
答案2
正如其他人已经注意到的那样,您的方法存在两个问题。它们与.zip
vs文件无关.sh
,但与文件的名称和位置有关。
您需要在命令替换周围加上双引号。否则它们会在空格字符处中断。看为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?更多细节。
此外,该ls
命令仅输出文件的基本名称,而不输出目录部分。cp
因此只能看到基本名称,不知道您指的是不同目录中的文件。解决此问题的一种方法是首先切换到所需的目录。
cd /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/
cp -p -- "`ls -tr | tail -n1`" ../Backup1/
如果您只想要最新的 zip 文件而不是最新的文件(无论它是什么):
cd /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/
cp -p -- "`ls -dtr -- *.zip | tail -n1`" ../Backup1/
如果目录为空或者文件名包含在当前语言环境中不可打印的换行符或字符,则此操作将失败并显示奇怪的错误消息,但这些情况相对较少。
如果存在名称与 匹配的子目录,该选项-d
可以提供一点额外的安全性*.zip
。您不需要该选项-1
,当 的输出ls
重定向到另一个命令时,它的效果是自动的。
或者,您可以使用桀骜这使得这一切变得美好而简单,这要归功于它全局限定符。
cp -p /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Original/*(om[1]) /Users/Me/Documents/Coffi\ Work/FTP\ Backup\ Shell\ Script/Backup1/
答案3
这是因为这取决于您执行cp
.在您的示例中,ls -tr1 /Users/Me/Whatever
将仅返回website3.zip
.如果您运行cp
from /tmp
,那么它将尝试查找该文件/tmp/website3.zip
。
要ls
显示完整路径,您应该使用通配符*
。根据您的需要,指定-d
不ls
列出所有子目录的内容的选项可能会很有用:
$ ls -tr1d /Users/Me/Whatever
...
website3.zip
$ ls -tr1d /Users/Me/Whatever/*
...
/Users/Me/Whatever/website3.zip
但是,请小心,以防最后修改的条目是目录。在这种情况下,cp
如果省略该-R
选项,则不会复制它。
如果您的文件始终具有.zip
扩展名,您可以考虑:
$ ls -tr1d /Users/Me/Whatever/*.zip
如果您的目录为空,您也可能会收到错误消息。你为什么不编写这样的脚本:
#!/bin/bash
MY_DIR="/Users/Me/Documents/Coffi Work/FTP Backup Shell Script/Original/"
DEST="/Users/Me/Documents/Coffi Work/FTP Backup Shell Script/Backup1/"
FILEEXT="zip"
NEWEST=`ls -tr1d "${MY_DIR}/"*.${FILEEXT} 2>/dev/null | tail -1`
if [ -z "${NEWEST}" ] ; then
echo "No file to copy"
exit 1
elif [ -d "${NEWEST}" ] ; then
echo "The most recent entry is a directory"
exit 1
else
echo "Copying ${NEWEST}"
cp -p "${NEWEST}" "${DEST}"
fi
答案4
cp -p $(find `pwd` -name `ls -Art <SOURCE> | tail -1`) <DESTINATION>
ls -Art <SOURCE> | tail -1
给你目录下最新的文件$(find `pwd` -name `ls -Art <SOURCE> | tail -1`)
给你最新文件的绝对文件。cp -p $(find `pwd` -name `ls -Art <SOURCE> | tail -1`) <DESTINATION>
将文件从源复制到目标!