찾기는 명령줄에서는 잘 작동하지만 스크립트에서는 작동하지 않습니다.

찾기는 명령줄에서는 잘 작동하지만 스크립트에서는 작동하지 않습니다.

나는 Debian Jessie 호스트에서 스크립트를 작성하려고 합니다.

스크립트에서 다음 명령(일부 변형 있음)을 실행하는 데 문제가 있습니다.

find ~/* -path ~/FileSniper* \
-prune -o \
-type f \( -name "*.mp4" -o -name "*.sh" -or -name "*.mp3" \) \
! -name '*.txt' -printf "%f\n"

스크립트에서 내가 하려는 것은 사용자가 검색하려는 파일 형식을 입력하도록 한 다음 이를 에 파이프하여 sed올바른 형식을 얻도록 하는 것입니다.

 echo "Input the formats like this: \"mp3,mp4,exe,sh\""
        read -p "input:" formats
        formattedformats=`echo "-name \"*.""$formats""\"" | sed 's/,/" -o -name "*./g'`
        find_parameters=(\(formattedformats\))

유언장에는 $find_parameters다음 내용이 포함됩니다.

-name "*.mp3" -o -name "*.mp4" -o -name "*.sh" 

이 줄에서 무엇이 문제인지 알 수 없습니다.

find ~/* -path ~/FileSniper* -prune -o -type f  "${find_parameters[@]}" ! -name "*.txt" -printf "%f\n" > foundfiles.txt

가능한 한 많이 조사했지만 여전히 문제가 무엇인지 알 수 없습니다. 올바른 방향을 알려주세요.

답변1

find이것은 (표준 입력이 아닌) 명령줄에서 파일 확장자를 읽고 이를 사용하여 의 옵션과 함께 -iregex사용할 정규식을 작성하는 스크립트입니다 .

원래 예에 표시된 것처럼 숨겨진 .디렉터리를 제외합니다 .~/FileSniper*

#! /bin/bash

regexp=''

for ext in "$@" ; do
    [ -n "$regexp" ] && regexp="$regexp\|"
    regexp="$regexp.*\.$ext$"
done

find ~ -not -path '*/.*' -not -path '*/FileSniper*' -type f \
    -iregex "$regexp" > foundfiles.txt

답변2

스크립트가 한 #!/bin/sh유형 또는 다른 유형 인 경우 유형 이름 확장을 구현하지 않는 기본 쉘 인터프리터를 사용하는 Debian 시스템에서 .sh스크립트가 실행되지 않는 이유를 설명합니다 .${find_parameters[@]}dash${array[@]}

-path ~/FileSniper*또한 귀하의 주장이 어떻게 바람직하지 않은 결과를 초래할 수 있는지도 알 수 있습니다 . ~/*이번 경우에도 마찬가지입니다. 작성된 대로 이는 확장이 아닌 쉘 확장입니다 find. 피연산자는 find [ ...paths... ]절대 확장되지 않으므로 ~/*- 이것이 실제로 원하는 것이라면 - 가능한 한 정확하되 -path ~/FileSniper*상위 쉘이 생성할 수 있는 모든 것으로 확장하십시오.앞으로패턴으로 사용됩니다 find. 따라서 경로와 일치하지 않으면 어차피 그대로 유지되기 ~/때문에 문제가 되지만 *, 만약하다그러면 더 이상 원하는 패턴으로 작동하지 않습니다.

인용해야 합니다. find ... -path ~/FileSniper\*문자 그대로의 코드명을 찾고 싶지 않은 ~경우에는 인용해야 합니다.

관련 정보