유닉스의 find 명령에서 디렉토리 경로 변수를 사용하는 방법

유닉스의 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

관련 정보