トークン ` |

トークン ` |

このエラーは引き続き発生します。

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ソリューションは隠された名前にも興味があり、シェルループはシンボリックリンクの名前を一般ファイルに変更することです。

関連:

おすすめ記事