使用 IF 语句中的逻辑 AND 来搜索文件 ext(tilde ~)

使用 IF 语句中的逻辑 AND 来搜索文件 ext(tilde ~)

请查看以下脚本:

#!/bin/bash
for index in `ls -1 /appdata/frozen_files`
do
 for bucket in `find /appdata/frozen_files/$index -name "*.gpg~" | cut -d/ -f4-5`
   do
    for files in `ls /appdata/frozen_files/$bucket/rawdata | wc -l`
     do
      if [[ ` "$files" -eq 1 && "file extension = .gpg~" ` ]];
       then
        echo $bucket >> /tmp/NAS_buckets_with_less_than_2_files.txt
      fi
     done
   done
 done

意图:我正在尝试查找以波浪符号 (~) 结尾的文件扩展名 = .gpg~。文件名示例 = journal.gz.gpg~。. .gpg~ 文件可在 /appdata/frozen_files/$bucket/rawdata | wc -l 上找到

我们可以创建一个包含文件扩展名的变量,看看系统是否有东西可以与之比较。

可以检查文件扩展名(.gpg~)的“东西”

答案1

我不确定我是否明白你在做什么。

这将打印所有rawdata以 为内部名称的目录/appdata/frozen_files/,这些目录包含少于两个名称以 结尾的文件.gpg~(子目录中的文件rawdata不计算在内):

find /appdata/frozen_files/ -type d -name "rawdata" -exec \
   sh -c '
      cd "$1" || exit 1
      num=$(find . ! -name . -prune -type f -name "*.gpg~" -exec printf "\n" \; | wc -l)
      [ "$num" -lt 2 ]
   ' sh {} \
\; -print

程序如下:

  1. 外部find查找所有rawdata目录。
  2. 对于每个这样的目录都会被调用;该目录在提供的命令中sh可用。"$1"
  3. 这个 shell cd-s 到目录并运行内部的find
  4. 这将直接在目录中的find每个文件打印一个换行符。*.gpg~
  5. 这些换行符按 来计算wc
  6. 结果(数字)存储为num变量。
  7. 如果结果低于2,则进行测试。
  8. 如果测试成功,外部find会打印目录。

笔记:

  • 由于可移植性和 POSIX 兼容性,解决方案很少:
    • ! -name . -prune代替-maxdepth 1
    • -exec printf "\n" \;代替-printf "\n"
  • 该变量可以被重复使用,例如:

    [ \( "$num" -gt 2 \) -a \( "$num" -lt 10 \) ]
    
  • 如果您需要以安全的方式解析输出,请使用-print0而不是。-print

  • 解析输出或修改命令以仅提取所获得的每个路径的一部分;例如,-print您可能想要使用:

    -exec sh -c 'basename "$(dirname "$1")"' sh {} \;
    

    获取rawdata符合条件的每个目录的父目录。

相关内容