{1..10}を使用してシーケンス番号でファイルの名前を変更することは可能ですか?

{1..10}を使用してシーケンス番号でファイルの名前を変更することは可能ですか?

疑問があります。シーケンス番号 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

関連情報