찾기 결과에 전체 경로와 디렉터리 이름을 사용해야 합니다. 이것은 작동하지 않습니다:
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
:t
csh 또는 vim과 같은 디렉터리의 ail(기본 이름)입니다.