このエラーは引き続き発生します。
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
これら2つのテストは、$filename
通常のファイルが参照されているか(またはそれを指すシンボリックリンク)、$filename
値の末尾から削除されたときに変更されていない(つまり、すでにサフィックスがあるかどうか)テストします。.old
ほぼ同じことを行うもう1つの方法は次のとおりですfind
。
find "$1" -maxdepth 1 -type f ! -name '*.old' -exec mv {} {}.old ';'
.old
サフィックスのない対応するファイル名がある場合、両方のソリューションは既存のファイルを上書きします.old
。もしあれば目次.old
サフィックスが付いたファイルは、$1
名前が変更されずにこのディレクトリに配置されます。
find
このソリューションとシェルループの違いは、このfind
ソリューションは隠された名前にも興味があり、シェルループはシンボリックリンクの名前を一般ファイルに変更することです。
関連: