Bash - 将文件路径与禁止路径列表进行比较

Bash - 将文件路径与禁止路径列表进行比较

我正在使用:

for file in $(find "$1" -maxdepth 10000 -xdev -ignore_readdir_race); do

从内部驱动器加载文件作为预热 ZFS ARC 的一种方式。$1 是起始目录,是启动代码时传递的参数。

我在 SU 上被告知这样做是错误的,所以我现在使用:

while read -r file; do

并依靠进一步的代码来避免从外部驱动器加载文件(它只是计算并分类这些文件)。代码将文件分类为目录 | 缓存文件(即:用于预热 ZFS ARC 的文件)| 符号链接 | 块设备 | 字符设备 | 管道 | 套接字 | 零长度文件 | 跳过的文件 | 过时文件(上次运行定位时存在但现在不再存在的文件)。

这是我遇到麻烦的将文件归类为跳过的文件的代码。

我尝试使用以下任一方法:

if [[ "$file" == *"$OP0"* ]]
if [[ "$file" =~ *"$OP0"* ]]

...$file是正在处理的文件的文件路径,$OP0 是省略的路径。一个这样的省略路径是 OP1="/media/$USER",其中所有外部驱动器都位于此处。

我尝试过使用:

case $file in (*$OP0*)
  SkipCnt++
esac

我尝试过使用:

if [[ contains "$file" "$OP0" ]]

...其中“contains”是一个函数。

我尝试过使用:

if [[ $file =~ ^($OP0)$ ]]

我尝试过使用:

if [[ $file -ef $OP0 ]]

这些命令在终端中有效……但放入脚本中(与在终端中成功运行的代码完全相同)时,它们不起作用。因此,我得到的 if elif fi 代码仅计算外部驱动器上的文件,并加载内部驱动器上的文件以填充 ZFS ARC(内部驱动器仅保存操作系统和相关文件,所有其他文件都存储在外部驱动器上),不起作用,因此缓存被一堆存档内容污染了。

以下是加载文件的代码(实际上是将它们复制到 /dev/null):

# You can use any one of these three, listed fastest to slowest
tar -cS --no-recursion --warning=none "$file" &>/dev/null
# cp --preserve=all --reflink=never "$file" /dev/null
# cat "$file" 1>/dev/null

那么...我应该使用哪个命令,以及如何使其在从 sudo 运行的脚本中运行?

感谢您的任何帮助,您可以提供。

例如,此代码简介:

OP0=/media/$USER/; OP1=/mnt; OP2=; OP3=; file=/boot/efi/grub/x86_64-efi/gcry_camellia.mod; if [[ "$file" =~ ^( "$OP0" || "$OP1" )$ ]] ; then echo $OP0; echo $OP1; echo $file ; fi

... 在交互式终端中工作。我从 $file 的屏幕打印输出中获取了该文件名和路径。

它反映了脚本中的设置。它正确地显示 $file 和 $OP0 或 $OP1 之间不匹配...但在脚本中它未能显示这一点,因此所有将被计为“跳过”的文件(即:外部驱动器上的文件)都被计为其他类别,并且由于它们大多数都是常规文件,因此它们被复制到 /dev/null 并因此加载到 ZFS ARC 中。

脚本中的相关代码为:

if [[ "$file" =~ ^( "$OP0" || "$OP1" )$ ]] ; then (( SkipCnt++ ))

...就是这样,这就是代码对该文件类型所做的全部工作,只是迭代一个计数器(除了它在脚本中不起作用)... 下面是其他分类的 elif。

对于长度不为零、存在于定位数据库中、不是目录、不是块设备、不是字符设备、不是管道、不是符号链接、不是套接字的文件... 这些文件将被复制到 /dev/null 并因此加载到 ZFS ARC 中。

相关内容