我需要知道如何使用变量在 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