我有一个 bash 脚本,用于将代码从测试环境部署到生产环境,但目前我必须手动将文件列表添加到 txt 文件中,有时我会漏掉一些文件。基本上,我的部署脚本 cat/loops 会复制文件。(也导出/导入数据库,但这并不相关..哈哈)
无论如何,我想使用该find
命令生成过去 14 天内修改的文件列表。问题是我需要删除路径./
才能使部署脚本正常工作。
以下是 find 命令用法的一个示例:
查找 . -type f -mtime -14 > deploy.txt
deploy.txt
下面是我的部署脚本中的一行:
for i in `cat deploy.txt`; do cp -i /home/user/beta/public_html/$i /home/user/public_html/$i; done
知道如何使用 bash 脚本实现这一点吗?
谢谢!
答案1
您可以使用-printf
命令行选项来%f
仅打印文件名而不打印任何目录信息
find . -type f -mtime -14 -printf '%f\n' > deploy.txt
或者您可以使用 sed 删除 ./
find . -type f -mtime -14 | sed 's|^./||' >deploy.txt
答案2
应该./
是无害的。大多数程序会将/foo/bar
和/foo/./bar
视为等价的。我知道这看起来不太好,但根据您发布的内容,我认为没有理由会导致您的脚本失败。
如果你真的想把它剥掉,sed
可能是最干净的方法:
find . -type d -mtime 14 | sed -e 's,^\./,,' > deploy.txt
如果你的系统上有 GNU find (例如大多数 Linux 系统),你可以使用以下命令一次性完成find -printf
:
find . -type d -mtime 14 -printf "%P\n" > deploy.txt
返回%P
找到的每个文件的完整路径,减去命令行上指定的路径,直到第一个斜杠(包括第一个斜杠)。这将保留目录结构中的所有子目录。
答案3
“find -printf” 解决方案在 FreeBSD 上不起作用,因为 find 没有这样的选项。在这种情况下,AWK 可以提供帮助。它返回姓氏 ($NF),因此它可以在任何深度上工作。
find /usr/local/etc/rc.d -type f | awk -F/ '{print $NF}'
PS:摘自D.Tansley《Linux和Unix shell编程》一书
答案4
嗯,您有几个选择。您可以使用-printf
find 中的选项仅打印出文件名,或者您可以使用 sed 之类的工具简单地删除./
。
# simply print out the filename, will break if you have sub-directories.
find . -mtime -14 -printf '%f\n'
# strip a leading ./
find . -mtime -14 | sed -e 's/^\.\///'