itsource

여러 명령을 사용하여 find -exec

mycopycode 2023. 4. 27. 22:22
반응형

여러 명령을 사용하여 find -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 ...)"

@Tinker의 대답을 연장하면서,

제 경우에는, 저는 다음을 만들어야 했습니다.command | command | command내부에-exec특정 텍스트가 포함된 파일에서 파일 이름과 발견된 텍스트를 모두 인쇄합니다.

다음과 같은 이점이 있습니다.

find . -name config -type f \( -exec  grep "bitbucket" {} \; -a -exec echo {} \;  \) 

결과:

    url = git@bitbucket.org:a/a.git
./a/.git/config
    url = git@bitbucket.org:b/b.git
./b/.git/config
    url = git@bitbucket.org:c/c.git
./c/.git/config

찾기를 사용하여 이 작업을 수행할 수 있을지는 모르겠지만 다른 방법은 셸 스크립트를 만들고 찾기를 사용하여 이 작업을 실행하는 것입니다.

마지막 줄sh:

echo $(tail -1 $1),$1

스크립트 실행 파일로 만들기

chmod +x lastline.sh

사용하다find:

find . -name "*.txt" -exec ./lastline.sh {} \;

카밀로 마틴 덕분에 관련 질문에 답할 수 있었습니다.

내가 하고 싶었던 것은

find ... -exec zcat {} | wc -l \;

효과가 없었어요하지만,

find ... | while read -r file; do echo "$file: `zcat $file | wc -l`"; done

작동합니다. 감사합니다!

데니스의 첫 번째 답은 문제를 해결하는 답입니다.그러나 제목에서 알 수 있는 것처럼 하나의 Exec에서만 여러 명령을 사용하여 더 이상 찾을 수 없습니다.한 임원에게 몇 가지 명령 사항으로 답변하려면 해결할 다른 방법을 찾아야 합니다.다음은 예입니다.

여러 {} 참조를 사용하여 1 exec 명령을 사용하여 지난 7일 동안 수정된 .log 파일의 마지막 10000행 유지

명령어가 어떤 파일에서 수행되는지 확인합니다.

find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "echo tail -10000 {} \> fictmp; echo cat fictmp \> {} " \;

수행: (더 이상 "\>"은 기록하지 않고 ">"만 필요합니다.)

find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp; cat fictmp > {} ; rm fictmp" \;

나는 보통 그것을 내장합니다.find소규모로for하나의 라이너를 루프합니다. 여기서 찾기는 하위 명령으로 실행됩니다.$().

그러면 명령은 다음과 같습니다.

for f in $(find *.txt); do echo "$(tail -1 $f), $(ls $f)"; done

좋은 점은 대신에{}당신은 그냥 사용합니다.$f 리고대에 에.-exec …은 당신은당신의모든사씁니다이에다음 사이에 모든 .do그리고.; done.

당신이 실제로 무엇을 하고 싶은지 확실하지 않지만, 아마도 이것과 같은 것인가요?

for f in $(find *.txt); do echo $f; tail -1 $f; ls -l $f; echo; done

저는 이 해결책을 찾았습니다(댓글에 이미 나와 있을 수도 있지만, 저는 이에 대한 답을 찾을 수 없었습니다)

"bash -c"를 사용하여 여러 명령을 한 번에 실행할 수 있습니다.

find . <SOMETHING> -exec bash -c "EXECUTE 1 && EXECUTE 2 ; EXECUTE 3" \;

당신의 경우에는

find . -name "*.txt" -exec bash -c "tail -1 '{}' && ls '{}'" \;

테스트 파일로 테스트했습니다.

 [gek@tuffoserver tmp]$ ls *.txt


casualfile.txt
[gek@tuffoserver tmp]$ find . -name "*.txt" -exec bash -c "tail -1 '{}' && ls '{}'" \;
testonline1=some TEXT
./casualfile.txt

xargs를 사용해야 합니다 :)

find *.txt -type f -exec tail -1 {} \; | xargs -ICONSTANT echo $(pwd),CONSTANT

다른 하나(OSx에서 작업 중)

find *.txt -type f -exec echo ,$(PWD) {} + -exec tail -1 {} + | tr ' ' '/'

A find+xargs정답.

는 모든 아의예모것찾습다니을을 ..html..BAK가 추가되었습니다 추예니습다었되가가확).1.html>1.html.BAK).

여러 자리 표시자가 있는 단일 명령

find . -iname "*.html" -print0 | xargs -0 -I {} cp -- "{}" "{}.BAK"

여러 자리 표시자가 있는 여러 명령

find . -iname "*.html" -print0 | xargs -0 -I {} echo "cp -- {} {}.BAK ; echo {} >> /tmp/log.txt" | sh

# if you need to do anything bash-specific then pipe to bash instead of sh

하거나 이명은하으시다같공음포파작다일동니합도에서함과 같은 합니다.-my file.html파라미터 인용과 그에 대한 감사합니다.--나고끝 cp에게 신호를 보내는 신호입니까?cp매개 변수의 끝과 실제 파일 이름의 시작.

-print0결과를 null 바이트 터미네이터로 파이프합니다.


잔 값으로-I {}는 " " " 를 정의합니다.{}자리 표시자로, 원하는 자리 표시자를 사용할 수 있습니다.-0입력 항목이 null로 구분되어 있음을 나타냅니다.

다음은 여러 파일을 찾은 다음 명령을 사용하여 모든 파일을 처리하는 데 사용할 수 있는 내 bash 스크립트입니다.

사용 예.이 명령은 다음을 적용합니다.file발견된 각 파일에 대한 linux 명령:

./finder.sh file fb2 txt

파인더 스크립트:

# Find files and process them using an external command.
# Usage:
#   ./finder.sh ./processing_script.sh txt fb2 fb2.zip doc docx

counter=0
find_results=()
for ext in "${@:2}"
do
    # @see https://stackoverflow.com/a/54561526/10452175
    readarray -d '' ext_results < <(find . -type f -name "*.${ext}" -print0)

    for file in "${ext_results[@]}"
    do
        counter=$((counter+1))
        find_results+=("${file}")
        echo ${counter}") ${file}"
    done
done
countOfResults=$((counter))
echo -e "Found ${countOfResults} files.\n"


echo "Processing..."
counter=0
for file in "${find_results[@]}"
do
    counter=$((counter+1))
    echo -n ${counter}"/${countOfResults}) "
    eval "$1 '${file}'"
done
echo "All files have been processed."

언급URL : https://stackoverflow.com/questions/5119946/find-exec-with-multiple-commands

반응형