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
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