이름에 "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
)