find -exec의 기본 이름

find -exec의 기본 이름

찾기 결과에 전체 경로와 디렉터리 이름을 사용해야 합니다. 이것은 작동하지 않습니다:

find ./1cv8 -maxdepth 1 -type d -wholename "./1cv8/*" -exec bash -c 'echo vrunner -src "{}" -o ./builds/"${basename "{}"}"' \;

실수:

bash: ${basename "./1cv8/common"}: bad substitution
bash: ${basename "./1cv8/conf"}: bad substitution
bash: ${basename "./1cv8/x86_64"}: bad substitution

도와주세요

답변1

${...}대체 명령 대체를 사용하면 직접적인 오류가 발생합니다 $(...). 그러나 일반적으로 경로 이름을 인라인 셸 스크립트에 삽입하는 대신 다음 항목 {}에 인수로 전달합니다 bash -c.

find ./1cv8 -maxdepth 1 -type d -exec bash -c '
    echo vrunner -src "$1" \
        -o "./builds/$(basename "$1")"
    ' bash {} \;

또는 각 게임마다 새로운 쉘을 시작하지 않고 약간의 속도 향상을 위해

find ./1cv8 -maxdepth 1 -type d -exec bash -c '
    for pathname do
        echo vrunner -src "$pathname" \
            -o "./builds/$(basename "$pathname")"
    done' bash {} +

이렇게 하면 이름에 따옴표나 셸이 확장, 리디렉션, 파이프 등으로 해석하는 항목이 포함된 이름에 문제가 발생하지 않습니다. 경로 이름이 더 이상 삽입되어 셸로 사용되지 않기 때문입니다.암호.

-wholename항상 그렇듯이 테스트를 제거했습니다 .진짜.

또한보십시오:


bash쉘 에서는 실제로 find최상위 디렉토리 이외의 다른 곳에서는 조회 디렉토리를 사용하지 않으므로 다음을 수행하십시오.

shopt -s nullglob dotglob

for pathname in ./1cv8/*; do
    if [ ! -d "$pathname" ] || [ -L "$pathname" ]; then
        # skip oven non-directories and symbolic links
        continue
    fi

    echo vrunner -src "$pathname" \
        -o "./builds/$(basename "$pathname")"
done

답변2

zsh다음 으로 전환하여 수행하세요.

for dir (1cv8/*(ND/)) vrunner -src $dir -o builds/$dir:t

그리고:

  • (ND/)글로벌 한정자는 다음과 같습니다.
    • N: nullglob: 일치하는 항목이 없으면 오류를 보고하지 않습니다.
    • D: 숨겨진 파일을 포함합니다( find기본값과 동일). 숨겨진 디렉터리를 실제로 처리하려는 경우가 아니면 건너뛰는 것이 좋습니다.
    • /: 전역 확장자를 파일 형식으로 제한합니다.목차(예를 들어 find) -type d.
  • $dir:t: tcsh 또는 vim과 같은 디렉터리의 ail(기본 이름)입니다.

관련 정보