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