我正在使用一个文件传入要从查找中排除的路径。我可以从命令行生成命令并运行它,但当我尝试从脚本执行它时,我会遇到错误。
这是我的脚本:
#!/usr/bin/env bash
nots=$(while read line; do
echo -n "-not -path "*/${line}/*" "
done < exclude_directories.txt)
echo $nots
echo "Run this command:"
echo "find ~/files -type f $nots > ~/files.txt"
find ~/files -type f $nots > ~/files.txt
当我运行脚本时,find命令会返回每个文件,甚至是nots
中指定的文件。
以下是启用设置后的输出:
$ ./dump_all_local_repo_files.sh
nots=$(while read line; do
echo -n "-not -path "*/${line}/*" "
done < exclude_directories.txt)
++ read line
++ echo -n '-not -path "*/.git/*" '
++ read line
++ echo -n '-not -path "*/vendor/*" '
++ read line
++ echo -n '-not -path "*/external/*" '
++ read line
++ echo -n '-not -path "*/node_modules/*" '
++ read line
++ echo -n '-not -path "*/test/*" '
++ read line
+ nots='-not -path "*/.git/*" -not -path "*/vendor/*" -not -path "*/external/*" -not -path "*/node_modules/*" -not -path "*/test/*" '
echo $nots
+ echo -not -path '"*/.git/*"' -not -path '"*/vendor/*"' -not -path '"*/external/*"' -not -path '"*/node_modules/*"' -not -path '"*/test/*"'
-not -path "*/.git/*" -not -path "*/vendor/*" -not -path "*/external/*" -not -path "*/node_modules/*" -not -path "*/test/*"
echo "Run this command:"
+ echo 'Run this command:'
Run this command:
echo "find ~/files -type f $nots > ~/files.txt"
+ echo 'find ~/files -type f -not -path "*/.git/*" -not -path "*/vendor/*" -not -path "*/external/*" -not -path "*/node_modules/*" -not -path "*/test/*" > ~/files.txt'
find ~/files -type f -not -path "*/.git/*" -not -path "*/vendor/*" -not -path "*/external/*" -not -path "*/node_modules/*" -not -path "*/test/*" > ~/files.txt
find ~/files -type f $nots > ~/files.txt
+ find /Users/ken/files -type f -not -path '"*/.git/*"' -not -path '"*/vendor/*"' -not -path '"*/external/*"' -not -path '"*/node_modules/*"' -not -path '"*/test/*"'
您的find
版本真的支持-not
运算符吗?通常拼写为!
。
要查找所有非目录,您将使用
find . ! -type d
您还应该删除中的引号
find ~/files -type f "$nots"
因为有了引号就没有分词。也就是说,
nots=$(while read line; do
echo -n "-not -path */${line}/* "
done < exclude_directories.txt)
find ~/files -type f $nots > ~/files.txt
应该起作用。