我有一组定期更新的文件夹,我想定期解析这些文件夹并更新为简单的文本文件列表。该列表与 rsync 一起使用,因此我使用 sed 缩短文件名以便于同步。
它们的设置非常像这样:
- 软件文件夹
- 软件版本_1
- 版本_1.1
- 一些文件
- 版本_BETA
- 一些文件
- 版本_1.1
- 软件版本_2
- 版本_2.2
- 一些文件
- 版本_BETA
- 一些文件
- 版本_2.2
- 软件版本_1
我尝试过类似的事情:
for dir in `find -maxdepth 2 -type d -name '*BETA'`; do test `find $dir -type f -mtime -1` | echo $dir | sed "s|^\./||" >> list.txt; done
但输出仍然列出所有BETA文件夹(并在.aspx
文件上给出“未知操作数”错误?)。
如果脚本在找到至少一个已修改文件并更新文件夹列表后可以移动到下一个文件夹,那么它就不必遍历每个文件夹的其余文件,这将是一个额外的好处。
答案1
要查找其中*BETA
包含新文件的所有目录 ( -mtime -1
) 并将这些目录名称保存在 中list.txt
,请尝试:
find -type f -path '*BETA/*' -mtime -1 | sed 's|^\./||; s|BETA/.*|BETA|' | sort -u >list.txt
由于您的目标是在文件中创建换行符分隔的数据list.txt
,因此这必定意味着您不希望任何目录或文件的名称本身包含换行符。如果他们这样做了,那么当然就需要不同的输出格式。
怎么运行的
find -type f -path '*BETA/*' -mtime -1
这会查找路径中某处具有父目录的所有新文件,
BETA
当 find 的约定定义 new 时,其名称以-mtime -1
.sed 's|^\./||; s|BETA/.*|BETA|'
这会删除文件名中的首字母
./
,并删除BETA
.结果是BETA 目录的名称。sort -u
创建的目录列表
sed
将有重复项。这会删除重复项。>list.txt
这将输出保存在
list.txt
更通用的解决方案
即使目录或文件的名称中包含换行符,以下方法也是安全的(这可能需要 GNU 工具):
find -type f -path '*BETA/*' -mtime -1 -print0 | sed -z 's|^\./||; s|BETA/.*|BETA|' | sort -zu >list.out
这将创建一个文件list.out
,其中的目录名称以空分隔形式。由于 nul 字符永远不会出现在文件或目录名中,因此这是一种安全的方法。要使用list.out
,您当然需要使用能够理解空分隔输入的工具来读取它。