排除 Bash 文件修改自身

排除 Bash 文件修改自身

我正在学习如何使脚本“万无一失”。我有一些脚本可以修改当前文件夹中的文件,但它们也会修改脚本本身。我知道这一切都归结为“for”循环和“find”我无法理解。

for f in $(find . -type f | grep -v $0)

我的目标是包含它可以从当前目录及其子目录中找到的所有文件,但排除执行的脚本本身。它与 grep -v 一起使用,但现在它排除了包含脚本名称的每个文件(例如子文件夹中的脚本副本)。有人知道如何使其仅适用于执行的脚本吗?我必须假设有人可能会在某个时候更改名称,因此手动排除它是不可能的。

答案1

该方法的示例find . -type f ! -path $0。请注意该脚本如何仅foo.sh报告“d”目录。不是foo.sh当前目录中的。

$ find . -print
.
./a
./b
./c
./foo.sh
./d
./d/foo.sh
$ cat foo.sh
#!/bin/bash
for f in $(find . -type f ! -path $0); do
echo $f
done
$ ./foo.sh
./a
./b
./c
./d/foo.sh
$

或者,尝试for f in $(find . -type f | grep -v "^\./foo\.sh$"); do

答案2

出什么问题了:

for f in $(find . -type f); do
 case $f in 
  */$0|$0)
     continue
  ;;
  *)
     echo 'Do something'
  ;;
 esac
 fi
done 

相关内容