성공하지 않고 여러 명령으로 find -exec를 사용하려고합니다. 다음과 같은 명령이 가능한지 아는 사람이 있습니까?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
기본적으로 현재 디렉토리에있는 각 txt 파일의 마지막 줄을 인쇄하고 줄 끝에서 쉼표 뒤에 파일 이름을 인쇄하려고합니다.
답변
find
-exec
명령에 여러 부분을 허용 합니다. 예를 들면 다음과 같습니다.
find . -name "*.txt" -exec echo {} \; -exec grep banana {} \;
이 경우 두 번째 명령은 @Caleb에서 언급 한 것처럼 첫 번째 명령이 성공적으로 반환 된 경우에만 실행됩니다. 성공 또는 실패에 관계없이 두 명령을 모두 실행하려면 다음 구성을 사용할 수 있습니다.
find . -name "*.txt" \( -exec echo {} \; -o -exec true \; \) -exec grep banana {} \;
답변
find . -type d -exec sh -c "echo -n {}; echo -n ' x '; echo {}" \;
답변
다음 중 하나 :
find *.txt -exec awk 'END {print $0 "," FILENAME}' {} \;
find *.txt -exec sh -c 'echo "$(tail -n 1 "$1"),$1"' _ {} \;
find *.txt -exec sh -c 'echo "$(sed -n "\$p" "$1"),$1"' _ {} \;
답변
다른 방법은 다음과 같습니다.
multiple_cmd() {
tail -n1 $1;
ls $1
};
export -f multiple_cmd;
find *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
한 줄에
multiple_cmd() { tail -1 $1; ls $1 }; export -f multiple_cmd; find *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
- ”
multiple_cmd()
“-함수입니다 - ”
export -f multiple_cmd
“-다른 서브 쉘이 볼 수 있도록 내보내기 - ”
find *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
“-예제에서 함수를 실행할 것임을 찾으십시오.
이런 식으로 multiple_cmd는 필요한만큼 길고 복잡 할 수 있습니다.
도움이 되었기를 바랍니다.
답변
더 쉬운 방법이 있습니다 :
find ... | while read -r file; do
echo "look at my $file, my $file is amazing";
done
또는
while read -r file; do
echo "look at my $file, my $file is amazing";
done <<< "$(find ...)"
답변
find 로이 작업을 수행 할 수 있는지 모르겠지만 대체 솔루션은 쉘 스크립트를 만들고 find로 실행하는 것입니다.
lastline.sh :
echo $(tail -1 $1),$1
스크립트를 실행 가능하게 만들기
chmod +x lastline.sh
사용 find
:
find . -name "*.txt" -exec ./lastline.sh {} \;
답변
Denis의 첫 번째 답변은 문제를 해결하는 답변입니다. 그러나 실제로는 제목 제안과 같이 하나의 exec에서만 여러 명령으로 더 이상 찾을 수 없습니다. 몇 가지 명령으로 하나의 exec에 응답하려면 해결할 다른 것을 찾아야합니다. 예를 들면 다음과 같습니다.
여러 개의 {} 참조를 사용하여 1 개의 exec 명령을 사용하여 지난 7 일 동안 수정 된 .log 파일의 마지막 10000 행 유지
1) 어떤 파일에서 명령이 수행되는지 확인하십시오.
find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "echo tail -10000 {} \> fictmp; echo cat fictmp \> {} " \;
2) 수행 : (더 이상 “\>”이 아니라 “>”만 필요합니다.)
find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp; cat fictmp > {} ; rm fictmp" \;