現在のディレクトリにあるすべてのファイルの先頭にコンテンツを追加したいと思います。現在の作業ディレクトリからすべてのファイル名を一度に取得し、引数として渡す方法を学ぶ必要があります。各ファイルをスクリプトの引数として手動で指定することで、これを行う必要はありません。私はこの新しい知識を追加のスクリプトに使用したいと思います。私は側面や他の解決策は必要ありません。 command(ls
)出力を取得してパラメータに渡す方法を学ぶ必要があります。私はこれを試しましたが失敗しました。
./file-edit.sh $(ls)
./file-edit.sh `ls`
これは私の作業スクリプトです。
#!/bin/bash
lineno=2 # Append from line 2
BAD_ARGS=85 # Error code
string0="###################################################################"
string2="#Description :"
string3="#Date :`date +%d-%B-%Y`"
string4="#Author :Milos Stojanovic"
string5="#Contact: :https://www.linkedin.com/in/xxx/"
string6="###################################################################"
# Can be any other strings
if [ ! -f $1 ]; then
echo "Please specify at least 1 filename as an argument!"
exit $BAD_ARGS
fi
until [ -z "$1" ]
do
string1="#Script Name :$1"
file=$1;
sed -i ""$lineno"i $string0\n$string1\n$string2\n$string3\n$string4\n$string5\n$string6" $file
echo "File "\'$file\'" altered at line number: $lineno"
shift 1
done
exit 0
ベストアンサー1
スクリプトで各パラメータを個別に処理するには、次のようにスクリプトでループを使用します。
for pathname do
# Insert code here that uses "$pathname".
# You will not need to shift arguments.
done
現在のディレクトリのすべての名前でスクリプトを呼び出すには、次のようにします。
./script.sh ./*
シェルは、./*
パターンを現在のディレクトリのすべての名前を含むリストに展開します。
使用に比べて利点は、有効な文字(スペース、タブ、改行を含む)を含むファイル名をls
使用しないため、処理できることです。ls
あるいは、ファイル名ワイルドカードをスクリプト自体に移動することもできます(コマンドラインでスクリプトに引数を提供する必要はありません)。
for pathname in ./*; do
# Insert code here that uses "$pathname".
done
スクリプトが通常のファイルを参照する名前と非伝統的なファイル(ディレクトリなど)を参照する名前とを区別する必要がある場合は、-f
ループでテストを使用してください。
# skip non-regular files
[ ! -f "$pathname" ] && continue
これにより、通常のファイルへのシンボリックリンクが可能になります。これもスキップするには、テストを次に変更してください。
if [ ! -f "$pathname" ] || [ -L "$pathname" ]; then
# Skip non-regular files and symbolic links.
continue
fi
その他の提案:
文字列に改行文字を含む複数行文字列を変数に割り当てることができます。
boilerplate='Hello and welcome!
This is my program.
Enjoy'
テキスト文書の2行目の後にテキストを挿入するにはsed
(-i
ここでは内部編集に使用されます)を使用します。
printf '%s\n' "$boilerplate" | sed -i '2r /dev/stdin' somefile
またはこちらのドキュメントを使用して
sed -i '2r /dev/stdin' somefile <<END_BOILERPLATE
Hello and welcome!
This is my program.
Enjoy
END_BOILERPLATE