質問があります。シリアル番号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つのソースファイル/ディレクトリと最後にターゲットファイル/ディレクトリが必要です。
これは次のことを意味します。
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