スクリプトにはさまざまな障害点が考えられます。まず、グロビングをrm *.old*
使用して、一致するすべてのファイルのリストを作成します。これにより、空白を含むファイル名を処理できます。ただし、スクリプトはグロブの各結果に変数を割り当て、引用符なしでそれを行います。ファイル名に空白が含まれている場合、これは壊れます。例えば:
$ 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バックアップファイルではありません。私はスクリプトでそれをしようとしています。ありがとう