[bash] 여러 명령으로 -exec 찾기

성공하지 않고 여러 명령으로 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" \;