토큰 ` |

토큰 ` |

이 오류가 계속 발생합니다.

line 3: Syntax error near unexpected token `|'

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

for filename in $(ls $1) | grep -v ".old"
do
    mv "$1/$filename" "$1/$filename.old"
done

어떤 수정 사항이 있나요?

답변1

for filename in "$1"/*; do
    if [ -f "$filename" ] &&
       [ "${filename%.old}" = "$filename" ]
    then
        mv -- "$filename" "$filename.old"
    fi
done 

텍스트 의 경우 프로그램에 대한 입력이 아닌 눈으로 읽을 수 있도록 grep출력을 사용합니다 .ls

발생한 오류는 코드의 구문 오류로 인해 발생합니다. 반복 for(여러 단어에 대한 반복) 구문은 다음과 같습니다.

for variable in word-list; do ...; done

상단의 코드는 특정 디렉토리의 모든 일반 파일을 반복하여 파일 이름 접미사가 없는 경우 파일 이름 접미사를 $1제공합니다 . .old이 두 테스트는 $filename일반 파일이 참조되는지(또는 이를 가리키는 심볼릭 링크), $filename값의 끝에서 제거될 때 변경되지 않은 상태로 유지되는지(즉, 이미 접미사가 있는지 여부)를 테스트합니다..old

거의 동일한 작업을 수행하는 또 다른 방법은 다음과 같습니다 find.

find "$1" -maxdepth 1 -type f ! -name '*.old' -exec mv {} {}.old ';'

.old접미사가 없는 해당 파일 이름이 있는 경우 두 솔루션 모두 기존 파일을 덮어씁니다 .old. 만약 있다면목차.old접미사 가 붙은 파일은 $1이름이 바뀌지 않고 이 디렉토리에 배치됩니다.

find이 솔루션과 셸 루프의 차이점은 이 find솔루션은 숨겨진 이름에도 관심을 갖고 셸 루프는 기호 링크의 이름을 일반 파일로 바꾼다는 것입니다.

관련된:

답변2

당신은 기본적으로 이것이 숙제이고 실제 생활과 아무 관련이 없다는 것을 인정했습니다. 댓글에 적힌 대로 선생님께서 이렇게 하라고 하실 수도 있어요.

for filename in $(ls "$1" | grep -v '\.old$')

선생님이 극도로 어리 석고 무지한 경우 따옴표, \및 를 생략하는 것을 선호할 수 있습니다 $. 선생님 소개 부탁드려요Unix 및 Linux 스택 교환. 그러나 선생님이 일을 올바르게 수행하는 방법을 배울 수 없거나 배우지 않으려면 선생님이 원하는 방식으로 작업을 수행하십시오.

그러면 결함이 있기 때문에 즉시 잊어버리십시오.


이것은 변형입니다코살로난다의 답변 이 글이 더 읽기 쉬울 수도 있습니다. (오류 검사를 추가했습니다. 왜냐하면올바른 접근 방식™. )

if [ "$1" = "" ]
then
    printf 'Usage:  %s <directory-name>\n' "$0"
    exit 1
fi
if [ ! -d "$1" ]
then
    printf 'Error: %s is not a directory.\n' "$1"
    exit 2
fi
for filename in "$1"/*
do
    case "$filename" in
       (*.old)                  # Skip
        ;;
       (*)
        mv -- "$filename" "$filename.old"
    esac
done

당신은 또한 원할 수도 있습니다

  • $1디렉토리가 있는 경우를 처리하지만
    • 완전한 권한이 없거나
    • 비어 있습니다.
  • 디렉터리, 기호 링크 및 기타 콘텐츠의 이름을 바꿔야 하는지 묻습니다.

답변3

배쉬를 사용하고확장 파일 확장자:

shopt -s extglob
for file in !(*.old); do ...

관련 정보