여러 명령을 사용하여 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
'itsource' 카테고리의 다른 글
WPF 템플릿 바인딩과 상대 소스 템플릿화된 상위 항목 (0) | 2023.04.27 |
---|---|
파일 또는 어셈블리 '시스템'을 로드할 수 없습니다.런타임.Interop Services.런타임 정보 (0) | 2023.04.27 |
Windows 8의 Metro 앱은 동일한 컴퓨터의 백엔드 데스크톱 앱과 어떻게 통신합니까? (0) | 2023.04.27 |
사용자 지정 오류 모드="Off" (0) | 2023.04.27 |
@module/material/index.d.ts'는 모듈이 아닙니다. (0) | 2023.04.27 |