BASH-当$@包含不存在的文件时,如何将find与$@一起使用?

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

我有一个函数,它作为参数传递了几个文件名。有些文件名可能指的是不存在或已删除的文件。因为args中可能也有目录,所以我希望得到一个递归列表,其中包含作为args传递的所有文件以及目录中包含的所有文件(可能包含为args)

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将下降到参数中给定的任何定向中。