从 find 命令输出中删除路径

从 find 命令输出中删除路径

我有一个 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

嗯,您有几个选择。您可以使用-printffind 中的选项仅打印出文件名,或者您可以使用 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/^\.\///'

相关内容