请查看以下脚本:
#!/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
程序如下:
- 外部
find
查找所有rawdata
目录。 - 对于每个这样的目录都会被调用;该目录在提供的命令中
sh
可用。"$1"
- 这个 shell
cd
-s 到目录并运行内部的find
。 - 这将直接在目录中的
find
每个文件打印一个换行符。*.gpg~
- 这些换行符按 来计算
wc
。 - 结果(数字)存储为
num
变量。 - 如果结果低于
2
,则进行测试。 - 如果测试成功,外部
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
符合条件的每个目录的父目录。