하위 폴더의 각 파일에 bash 기능을 반복적으로 적용

하위 폴더의 각 파일에 bash 기능을 반복적으로 적용

디렉터리의 각 파일에 bash 함수를 반복적으로 적용하는 스크립트를 작성하려고 합니다. 예를 들어, 해당 디렉터리에 tests내 파일과 하위 디렉터리가 모두 포함되어 있으면 스크립트는

find tests -type f -print0 | xargs -0 echo

완벽하게 작동합니다. 이제 에코 대신 bash 기능을 적용할 수 있기를 원하므로 다음과 같은 것을 생각해냈습니다.

function fun() {
    echo $1
}

export -f fun

find tests -type f -print0 | xargs -0 bash -c 'fun "$@"'

그러나 이전에는 모든 파일을 출력했지만 테스트에서는 단일 파일만 출력했습니다. 나는 이 두 가지가 동일하게 실행되기를 원합니다. 그렇죠?

답변1

쉘 스크립트를 사용하십시오.

에서 인용이 훌륭한 답변:

쉘 외에 다른 프로그램에서 이를 사용할 수 있어야 합니까?그렇다면 스크립트여야 합니다.

다른 답변에서 이미 지적했듯이가능한함수를 내보내서 이 문제를 해결하십시오. 그러나 이것은 확실히많은스크립트를 사용하는 것이 더 쉽습니다.

#!/bin/bash
# I'm a script named "fun"!  :)
printf '%s\n' "$@"

그런 다음 fun스크립트를 PATH(아마도 ~/bin)의 어딘가에 넣고 실행 가능한지 확인한 후 다음을 실행할 수 있습니다.

find tests -type f -exec fun {} +

답변2

-n1이 문제를 해결하는 방법에는 두 가지가 있습니다. 모든 인수를 사용하거나 루프 함수 내에서 한 번에 하나의 인수만 사용하여 명령을 실행하도록 xargs에 지시할 수 있습니다 fun.

function fun() { echo $1 }
export -f fun
find tests -type f -print0 | xargs -n1 -0 bash -c 'fun "$@"' --

또는

function fun() { while [ -n "$1" ]; do echo $1; shift; done }
export -f fun
find tests -type f -print0 | xargs -0 bash -c 'fun "$@"' --

답변3

GNU Parallel을 사용하면 다음과 같습니다:

function fun() {
    echo "$@"
}
export -f fun

find tests -type f -print0 | parallel -0 -Xj1 fun

관련 정보