如何从ls输出中动态排除文件?

安东·捷列姆肖诺克

我执行命令:

echo $(ls -p "/root/arch" -1tr | grep -v / )
20190107224626.ogg 20190107224705.ogg 20190107224720.ogg 20190107224645.ogg

我得到了整个文件列表,从最旧的(从创建日期开始)排序。一切正常。

还需要动态排除文件(有些文件名称相同,但扩展名为 .lock 且位于不同的文件夹中):

echo $(ls -p "/root/pids" -1tr | grep -v / )
20190107224645.ogg.lock 20190107224705.ogg.lock

我执行命令:

echo $(ls -1tr /root/pids/*.lock | awk -F/ '{print $NF}' | grep -Po '.*(?=\.)' | while IFS= read -r line; do echo "-I \"$line\" "; done)
-I "20190107224645.ogg" -I "20190107224705.ogg"

现在我尝试将所有这些合并到一行中,但它不能正常工作(我得到了所有 4 个文件,而不是两个),我做错了什么,我该如何解决?

echo $(ls -p "/root/arch" -1tr $(ls -1tr /root/pids/*.lock | awk -F/ '{print $NF}' | grep -Po '.*(?=\.)' | while IFS= read -r line; do echo "-I \"$line\" "; done) | grep -v / )
20190107224626.ogg 20190107224705.ogg 20190107224720.ogg 20190107224645.ogg
科迪

如果我在短时间内阅读标记为SO 问题学到了一件事,那就是解析的输出ls是不受欢迎的。

下面是另一种方法。它遍历 中的每个文件arch/,如果没有找到带有.lock后缀的相应文件名pids/,则输出文件名:

find arch -type f -printf '%f\0' | while IFS= read -r -d '' line; do
    if [[ ! -e pids/$line.lock ]]; then
      echo "$line"
    fi
done | sort -n

结果:

20190107224626.ogg
20190107224720.ogg

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章