BASH-当$@包含不存在的文件时,如何将find与$@一起使用?
我有一个函数,它作为参数传递了几个文件名。有些文件名可能指的是不存在或已删除的文件。因为args中可能也有目录,所以我希望得到一个递归列表,其中包含作为args传递的所有文件以及目录中包含的所有文件(可能包含为args)BASH-当$@包含不存在的文件时,如何将find与$@一起使用?,bash,unix,Bash,Unix,我有一个函数,它作为参数传递了几个文件名。有些文件名可能指的是不存在或已删除的文件。因为args中可能也有目录,所以我希望得到一个递归列表,其中包含作为args传递的所有文件以及目录中包含的所有文件(可能包含为args) function SomeFunction () { # get list of files recursively fList=$(find $@ -type f) do something with $fList . . . } [~]$Some
function SomeFunction () {
# get list of files recursively
fList=$(find $@ -type f)
do something with $fList
.
.
.
}
[~]$SomeFunction existentFile nonexistentFile existentNonEmptyDir
find: `nonexistentFile': No such file or directory
fList=$(find$@-typef)
如果没有不存在的文件
,它将非常有用。即使缺少文件,也有办法进行相同的调用吗?完全可以忽略find
中的警告。但是,如果要筛选参数列表中在调用之前实际存在的内容,可以显式执行此操作:
SomeFunction() {
local -a existing_args=( )
for arg in "$@"; do
[[ -e "$arg" ]] && existing_args+=( "$arg" )
done
while IFS= read -r -d '' result; do
printf 'Processing result: %q\n' ## put your own code here
done < <(find "${existing_args[@]}" -type f -print0)
}
SomeFunction(){
本地-现有参数=()
对于“$@”中的arg,请执行以下操作
[[-e“$arg”]&&existing_args+=(“$arg”)
完成
当IFS=read-r-d“”结果时;执行
printf'处理结果:%q\n'##在此处输入您自己的代码
完成<忽略find
中的警告是完全合理的。但是,如果要筛选参数列表中在调用之前实际存在的内容,可以明确执行以下操作:
SomeFunction() {
local -a existing_args=( )
for arg in "$@"; do
[[ -e "$arg" ]] && existing_args+=( "$arg" )
done
while IFS= read -r -d '' result; do
printf 'Processing result: %q\n' ## put your own code here
done < <(find "${existing_args[@]}" -type f -print0)
}
SomeFunction(){
本地-现有参数=()
对于“$@”中的arg,请执行以下操作
[[-e“$arg”]&&existing_args+=(“$arg”)
完成
当IFS=read-r-d“”结果时;执行
printf'处理结果:%q\n'##在此处输入您自己的代码
完成<
- 双引号
$@
,否则shell将对元素执行分词和文件名全局搜索
- 不要将
find
的输出保存为字符串。如果任何文件名包含空格,则该字符串将中断
- 双引号
$@
,否则shell将对元素执行分词和文件名全局搜索
- 不要将
find
的输出保存为字符串。如果任何文件名包含空格,则该字符串将中断
$@
需要加引号--“$@”
--才能正常工作。否则它与未加引号使用$*
完全相同。除此之外,您是否可以尝试生成一个--其他人可以在不做任何更改的情况下运行代码来生成您自己的错误?…另外请注意,fList=$(…)
本身就有缺陷——您试图将字符串列表存储在一个本身就是字符串的变量中。没有100%可靠的方法来判断一个文件名何时结束,下一个文件名何时开始(请记住,换行符本身在文件名中是合法的)。如果您希望$@
需要加引号--“$@”,则可以取消显示警告
--正常工作。否则它与未引用的$*
用法相同。除此之外,您是否可以尝试生成一个--其他人可以不经更改运行的代码来生成您自己的错误?…请注意fList=$(…)
本身就有缺陷——您试图将字符串列表存储在一个本身就是字符串的变量中。没有100%可靠的方法来判断一个文件名何时结束,下一个文件名何时开始(请记住,换行符本身在文件名中是合法的)。请看它是否已经工作,丢失的文件/目录将被跳过。如果您想注释find
是多余的(如果您已经检查了文件是否存在),则可以取消该警告,但随后我意识到find将下降到参数中给定的任何方向。我将注释find
如果您已经在检查文件是否存在,那么它是多余的,但是后来我意识到find将下降到参数中给定的任何定向中。