스크립트에 여러 가지 가능한 실패 지점이 있습니다. 우선, rm *.old*
사용 로빙 일치하는 모든 파일의 목록을 작성하고, 그 공백을 포함하는 파일 이름을 처리 할 수 있습니다. 그러나 스크립트는 glob의 각 결과에 변수를 할당하고 인용하지 않고 수행합니다. 파일 이름에 공백이 있으면 중단됩니다. 예를 들면 다음과 같습니다.
$ ls
'file name with spaces.old.txt' file.old.txt
$ rm *.old.* ## works: both files are deleted
$ touch "file.old.txt" "file name with spaces.old.txt"
$ for i in ./*; do oldfile=$i; rm -v $oldfile; done
rm: cannot remove './file': No such file or directory
rm: cannot remove 'name': No such file or directory
rm: cannot remove 'with': No such file or directory
rm: cannot remove 'spaces.old.txt': No such file or directory
removed './file.old.txt'
보다시피, 이름에 공백이있는 파일에 대해 루프가 실패했습니다. 올바르게하려면 변수를 인용해야합니다.
$ for i in ./*; do oldfile="$i"; rm -v "$oldfile"; done
removed './file name with spaces.old.txt'
removed './file.old.txt'
동일한 문제가 $i
스크립트에서 거의 모든 용도에 적용됩니다 . 당신은해야한다 항상 당신의 변수를 인용 .
다음 가능한 문제는 *.old.*
확장자가 파일과 일치 할 것으로 예상된다는 것 .old
입니다. 그렇지 않습니다. "0 자 이상"( *
), " a .
", "old", 다른 "0 자 이상"과 일치 .
합니다. 이 것이 의미 없는 같은 일치 file.old
하지만`file.old.foo 같은 단지 뭔가를 :
$ ls
file.old file.old.foo
$ for i in *; do if [[ "$i" == *.old.* ]]; then echo $i; fi; done
file.old.foo
따라서 일치하는 적이 없습니다 file.old
. 어쨌든 스크립트는 필요한 것보다 훨씬 복잡합니다. 대신 이것을 시도하십시오 :
#!/bin/bash
for i in *; do
if [[ -f "$i" ]]; then
if [[ "$i" == *.old ]]; then
rm -v "$i" || echo "rm failed for $i"
else
echo "$i doesn't have an .old extension"
fi
cp -v "$i" "$i".old
else
echo "$i is not a file"
fi
done
and cp echo` 문에 추가 -v
했습니다 .rm
which does the same thing as what you were doing with your
예를 들어을 (를) 찾을 때 file.old
제거되고 나중에 파일이 더 이상 존재하지 않으므로 스크립트가이를 복사하려고 시도하고 실패하기 때문에 이는 완벽 하지 않습니다. 그러나 스크립트가 실제로 시도하는 것을 설명하지 않았으므로 실제로 달성하려는 것을 알려주지 않으면 해결할 수 없습니다.
원하는 경우 i) .old
확장자를 가진 모든 파일을 제거 하고 ii) .old
확장자가없는 기존 파일에 확장자를 추가 하면 실제로 필요한 것은 다음과 같습니다.
#!/bin/bash
for i in *.old; do
if [[ -f "$i" ]]; then
rm -v "$i" || echo "rm failed for $i"
else
echo "$i is not a file"
fi
done
## All the ,old files have been removed at this point
## copy the rest
for i in *; do
if [[ -f "$i" ]]; then
## the -v makes cp report copied files
cp -v "$i" "$i".old
fi
done
rm *.old.*
이러한 파일을 제거합니다. file.old 백업 파일은 아닙니다. 내 스크립트에서 그렇게하려고합니다. 감사합니다