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を使用するとこの問題を克服できますが、evalevalは危険な可能性があるため、他の解決策を見つけることをお勧めします。

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

関連情報