이 오류가 계속 발생합니다.
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 ...