![찾기: '-exec' 인수 누락](https://linux55.com/image/62235/%EC%B0%BE%EA%B8%B0%3A%20'-exec'%20%EC%9D%B8%EC%88%98%20%EB%88%84%EB%9D%BD.png)
이 명령을 사용하려고 하면
var1=`sudo -u psoadmin -H -s ssh [email protected] find . -maxdepth 1 -type f -mtime +14 -exec ls -lh \{} \; | awk '{print $5, $9}'|egrep -v '^./upload|^./download|^./archive|^\.'`
그것은 나를 던져
find: missing argument to `-exec'
이 과정에서 제가 실수한 점이 있으면 알려주시기 바랍니다.
답변1
거기에서 일부 처리를 수행하는 쉘이 너무 많습니다. 또한 백틱을 사용하는 것은 좋지 않은 생각입니다. 특히 백틱이 포함된 경우에는 더욱 그렇습니다. 대신 구문을 사용해야 합니다 $(...)
.
sudo -s
명령을 실행하려면 셸을 시작하세요. 단, sudo
셸의 특수 문자 중 일부를 이스케이프 처리해 보세요. 당신은 그것을 사용하고 싶지 않습니다.
ssh
연결된 인수(인수 사이에 공백 포함)로 구성된 명령줄을 해석하기 위해 원격 호스트에서 쉘을 실행합니다.
그래서:
var1=`sudo -u psoadmin -H -s ssh [email protected] find . -maxdepth 1 -type f -mtime +14 -exec ls -lh \{} \;`
sudo
달리다:
"/bin/bash", ["/bin/bash", "-c",
"ssh daill_scp\\@files.dc1.responsys.net find \\. -maxdepth 1 -type f -mtime \\+14 -exec ls -lh \\{\\} \\;"]
( /bin/bash
또는 사용자의 로그인 쉘이 무엇이든).
, 는 어떻게 sudo
이스케이프되지만 백슬래시는 특별한 이유 없이 이스케이프되지 않습니다..
+
}
그러면 bash가 실행됩니다:
"/usr/bin/ssh", ["ssh", "[email protected]", "find", ".", "-maxdepth", "1", "-type", "f", "-mtime", "+14", "-exec", "ls", "-lh", "{}", ";"]
ssh
이를 연결하고 원격 호스트에서 실행합니다.
"$SHELL", ["$SHELL", "-c", "find . -maxdepth 1 -type f -mtime + 14 -exec ls -lh {} ;"]
( $SHELL
이번에는 원격 사용자의 로그인 셸은 어디에 있습니까?)
위의 내용은 ;
이스케이프되지 않으므로 명령 구분 기호로 해석되고 명령 구분 기호로 전달되지 않으므로 불만 사항이 종료되지 않습니다 find
.find
-exec
원하는 곳은 다음과 같습니다.
var1=$(
sudo -u psoadmin -H ssh [email protected] '
find . -maxdepth 1 -type f -mtime +14 -exec ls -lh {} \;' |
awk '{print $5, $9}' |
egrep -v '^./upload|^./download|^./archive|^\.'
)
(이 명령(특히 해당 egrep
부분)이 의미가 있는 것은 아닙니다.)
답변2
다음 방법을 시도해 보세요.
...-exec ls -lh {} \;...
(중괄호 앞의 백슬래시 제거) 큰따옴표:
var1=`sudo -u psoadmin -H -s ssh [email protected] "find . -maxdepth 1 -type f -mtime +14 -exec ls -lh {} \; "| awk '{print $5, $9}'|egrep -v '^./upload|^./download|^./archive|^\.'`
답변3
이 명령을 사용하려고 하면
var1=`sudo -u psoadmin -H -s ssh [email protected] find . -maxdepth 1 -type f -mtime +14 -exec ls -lh \{} \; | awk '{print $5, $9}'|egrep -v '^./upload|^./download|^./archive|^\.'`
이것이 나를 만든다
find: missing argument to `-exec'
다음을 사용해야 합니다.
var1=`sudo -u psoadmin -H -s ssh [email protected] "find . -maxdepth 1 -type f -mtime +14 -exec ls -lh {} \; | tr -s [:space:] | cut -d ' ' -f 5,9 | egrep -v '^./upload|^./download|^./archive|^\.'"`
- 사용
"find [..]"
사용
tr
-s, --squeeze-repeats replace each input sequence of a repeated character that is listed in SET1 with a single occurrence of that character
사용
cut
-d, --delimiter=DELIM use DELIM instead of TAB for field delimiter -f, --fields=LIST select only these fields; also print any line that contains no delimiter character, unless the -s option is specified