Bash 스크립트에서 와일드카드 *를 호출할 수 없습니다.

Bash 스크립트에서 와일드카드 *를 호출할 수 없습니다.

이름에 "v"가 포함된 파일을 삭제하는 프로그램을 만들려고 합니다.

내 스크립트에서는 디렉토리를 보도록 요청합니다. 코드는 기본적으로 다음과 같습니다

read -p "directory: " DIRECT

rm *v* $DIRECT

*v*그것은 파일이나 디렉토리의 이름이라고 생각 하고 그런 것이 존재하지 않는다고 알려주고 그냥 그 곳으로 이동하여 DIRECT삭제할 수 없다고 말합니다.

답변1

"rm" 대신 "find"를 사용하면 어떨까요?

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]

스크립트는 다음과 같습니다.

read -p "directory: " directory

find "$directory" -name "*v*" -type f -delete

find는 시작 디렉터리가 존재하는지 확인하고 기본적으로 해당 디렉터리의 모든 하위 디렉터리를 검색합니다. 재귀적으로 검색하지 않으려면 -maxdepth 0검색을 시작 디렉터리로만 제한하는 옵션을 추가해야 합니다. 위의 예에서는 -name플래그를 사용하여 파일 이름을 검색했지만 정규식( -regex옵션)을 사용할 수도 있습니다. 파일 유형(플래그)별로 검색을 제한할 수도 있습니다 -type. 예를 들어 -type f검색을 일반 파일로만 제한합니다. 발견된 파일을 삭제할 것임을 나타내려면 -delete 플래그를 사용하십시오. 더 많은 옵션이 필요하다면 sh# man find친구가 되어주세요 ;)

답변2

그런 일은 일어나지 않았습니다 rm. 이 시도:

read -p "Directory: " SEARCH_DIR
if [[ -z "$SEARCH_DIR" || ! -d "$SEARCH_DIR" ]]; then
    echo "Error! Please enter a valid directory."
    exit 1
fi
rm "${SEARCH_DIR}/"*v*

rm마지막 인수에서 파일을 찾으려면 rm을 사용할 때 특히 와일드카드를 사용할 때 항상 전체 또는 상대 경로를 사용하는 것이 좋습니다. 그렇지 않으면 끔찍한 일이 발생할 수 있습니다.

[root@JBCLAMP001 ~]# rm --help
Usage: rm [OPTION]... FILE...

다음과 같이 할 수도 있습니다.

read -p "Directory: " SEARCH_DIR
if [[ -z "$SEARCH_DIR" || ! -d "$SEARCH_DIR" ]]; then
    echo "Error! Please enter a valid directory."
    exit 1
fi
for file in "$SEARCH_DIR/"*; do
    if [ -f "$file" ]; then
        if [[ $(basename $file | grep "v") ]]; then
            rm -f "$file"
        fi
    fi
done

답변3

삭제된 부분은 다음과 같이 변경될 수 있습니다.

read -p "directory: " DIRECT

( shopt -s extglob ; rm -f "$DIRECT/"+([!v]) )

서브쉘(…)실행 중인 쉘의 조건이 변경되지 않습니다.

또 다른 방법은 find를 사용하는 것입니다.

find . -maxdepth 1 -regex '[^v]+' -type f -exec rm {} +

답변4

rm일치하는 파일/디렉토리가 없다는 불만을 방지하려면 *v*이 옵션을 사용해야 합니다 -f. 이러한 잠재적인 v 파일을 제거하려면 $DIRECT다음을 수행해야 합니다.

read -p "directory: " DIRECT

rm -f "$DIRECT"/*v*

삭제할 항목을 찾을 수 없는 경우(예: v 파일이 누락되었거나 디렉터리도 누락된 경우 $DIRECT)

관련 정보