
疑問があります。シーケンス番号 1 から 10 でファイルの名前を変更する必要があります。次のパラメータを使用してファイルを作成できます。
touch file.$(date +%Y).$$.{1..10}
しかし、次のコマンドを使用してファイルの名前を変更できません。なぜ {1..10} が取得されないのでしょうか。ファイルの名前を次のように変更したいのですが。mv コマンドは {1..10} を取得しますか?
file.201704.<PID>.1
file.201704.<PID>.2
.
.
.
.
それで、以下のコマンドは正しいですか?
for file in $(ls);
do
mv $file file.$(date +%Y%m).$$.{1..10}
done
答え1
中括弧の展開により、{1..10}
コマンド ラインが複数の引数を含むように展開されます。
例えば、touch
コマンドラインは次のように展開されます。
touch file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10
実行前に。touch
ユーティリティはコマンドラインで任意の数の引数を取るので、これは問題ありません。注: これにより、1 つのファイルではなく 10 個のファイルが作成されます。
ただし、このmv
ユーティリティは と比較してセマンティクスが異なりますtouch
。1 つまたは複数のソース ファイル/ディレクトリと、最後に 1 つのターゲット ファイル/ディレクトリが必要です。
これは、
mv $file $file.$(date +%Y%m).$$.{1..10}
次のように展開されます
mv file file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10
引っ越したいと思われている全てコマンドラインの最後の項目を除いて、ファイルは移動されません。さらに、コマンドラインの最後の項目はディレクトリ名である必要があります (複数のものを移動するため)。
そのループで実際に何をしたいのかは不明なので、この問題を解決する方法についてはこれ以上コメントできません。
ループ自体に関しては、お願いしますの出力をls
そのような形で使用しないでください。代わりに、
for file in ./*; do
# process "$file"
done
の出力はls
、見るいくつかの理由から、スクリプトでの使用には適していません。http://unix.stackexchange.com/questions/128985/why-not-parse-ls
また、変数は常に二重引用符で囲んでください。http://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash-posix-shells