如何在unix中的find命令中使用目录路径变量

如何在unix中的find命令中使用目录路径变量

我需要知道如何使用变量在 Find 命令中传递目录名称。我正在使用下面的命令,但它不起作用。

while read -r directory file ;do
  echo "$directory"---this command works $HOME/data
  echo "$file"
  x="$(find $directory -type f -name "$file" -mtime -1 -printf "%f\n")"--not working
  echo $x
done < "$HOME/static_data.txt"

我想通过循环传递目录和文件名。但是对于目录,它给我错误说

'$HOME/data' no such file or directory 

而我可以看到目录。

答案1

虽然您的echo "$directory"命令“有效”,但它不会扩展$HOME,后续使用也不会扩展$directory

你想要的目录不是 $HOME/data,该目录不存在(字面意思)。你想要的是$HOME(可能是类似的)的扩展/home/user313150/data

您可以通过使用来克服这个问题eval,但我建议寻找另一个解决方案,因为 eval 可能很危险。

while read -r directory file; do
  directory=$(eval echo "$directory")
  echo "$directory"
  echo "$file"
  x="$(find "$directory" -type f -name "$file" -mtime -1 -printf "%f\n")"
  echo $x
done < "$HOME/static_data.txt"

答案2

除了 Jesse_b 概述的语法问题之外,$HOME/static_data.txt用作循环输入的文件while还包含带有变量的条目。
这样做的问题是,当进入循环时, 不会$HOME展开$directory

可能的解决方案如下。

while read -r directory file ;do
  echo "$directory"
  echo "$file"
  x="$(find "$directory" -type f -name "$file" -mtime -1 -printf "%f\n")"
  echo "$x"
done <<<"$( envsubst < "$HOME/static_data.txt" )"

在将其传递到 while 循环之前,它envsubst会负责扩展。$HOME

相关内容