2017-11-20 9 views
0

約40枚の画像(「1.png」から「40.png」)の名前を変更しようとしています。mvコマンドでMacOSのbashエイリアスが壊れる

の端末でこの最初のコマンドが機能:

user$ ls | cat -n | while read n f; do mv "$f" "$n.png"; done 

しかし、私は〜/ .bash_profileの中の別名にそのコマンドをしたいのですが。

alias rename-png="ls | cat -n | while read n f; do mv "$f" "&n.png"; done" 

alias rename-png="ls | cat -n | while read n f; do mv /"$f/" /"&n.png/"; done" 

rename-png() { 
    ls | cat -n | while read n f; do mv "$f" "$n.png"; done 
} 

最初のエイリアスは機能しません。これは、引用符がエスケープされなかったためです。しかし、二重引用符をエスケープしている間でも、コマンドはmvになります。私も関数で試してみましたが、どちらもうまくいきませんでした。

エラー:

usage: mv [-f | -i | -n] [-v] source target 
     mv [-f | -i | -n] [-v] source ... directory 

誰かが私が間違っているのものを私に説明してもらえますか?

+0

Ex。 'alias l = 'ls -lp''エイリアス定義を変更し、その部分を= inの後に囲みます。 – Nic3500

+1

[ls'の出力を解析しない理由](http://mywiki.wooledge.org/ParsingLs) –

+1

BTW、*バックスラッシュ*はスラッシュではなく、二重引用符でエスケープするために使用されます。 '$ 'もエスケープする必要があります(エイリアスを使用する場合は、シングル引用符を使用する方が合理的ですが、これはchepnerが言うように - このユースケースの間違ったことです)。 –

答えて

1

この複合語にエイリアスを使用しないでください。関数を使うだけです。さらに、lsの出力を使用しないでください。パターン付きループforを使用してください。

rename-png() { 
    i=0 
    for f in ./*; do 
    mv "$f" "$i.png" 
    i=$((i + 1)) 
    done 
} 
+1

大域変数 'i'を避けるために、' local i = 0'にすることもできます(元のエイリアスも同様です)。 –

+0

名前が矛盾した場合にファイルを上書きしないように、 'mv -n'または' mv -i'に私の通常の嘆願を追加します。たとえば、 "0.png"と "1.png"という名前のファイルがある場合、0.pngを1.png(元の1.pngを上書きする)の名前を変更してから、同じファイルの名前を1に変更します。 png〜2.png。結果:0.pngは2.pngになり、1.pngはトレースなしで消滅します。 –

+0

私はこれをtest.shに入れます。test.sh:行9: 'rename-png ':有効な識別子ではありません – UsernameError3

関連する問題