如何筛选archives目录中比itp-files同名文件新的.gz文件并传入fzy?
解决方案
要实现筛选archives/中比itp-files/同名文件更新的.gz文件并传入fzy,可以利用bash的文件时间比较运算符-nt(表示前者比后者新),同时用while read循环处理文件名(避免空格拆分问题),具体脚本如下:
# 筛选符合条件的文件并传入fzy,最后处理选中的文件 ag -g "\.gz$" archives/ | while read -r archive_file; do # 提取文件名(不含路径) filename=$(basename "$archive_file") # 拼接itp-files中对应同名文件的路径 itp_file="itp-files/$filename" # 条件:如果archive文件比itp文件新,或者itp文件不存在(可选:若只保留两边都存在的文件,可加 -f "$itp_file" 判断) if [ "$archive_file" -nt "$itp_file" ]; then echo "$archive_file" fi done | fzy | while read -r selected_file; do echo "selected file: $selected_file" # 这里可以添加对选中文件的处理逻辑 done
关键说明:
- 文件时间比较:
[ "$archive_file" -nt "$itp_file" ]会判断archive_file的修改时间是否晚于itp_file,如果itp_file不存在,该判断也会返回true。如果只想保留itp-files/中存在对应文件的条目,可修改条件为:if [ -f "$itp_file" ] && [ "$archive_file" -nt "$itp_file" ]; then - 避免文件名空格问题:用
while read -r替代for f in $(...),可以正确处理文件名包含空格、特殊字符的情况,防止被错误拆分。 - 同名文件路径匹配:如果
itp-files/中的文件是去掉.gz后缀的同名文件(比如archives/a.gz对应itp-files/a),可修改文件名提取逻辑:filename=$(basename "$archive_file" .gz) itp_file="itp-files/$filename"
内容的提问来源于stack exchange,提问作者rubo77
相关产品推荐
相关产品推荐

