

macです。

あるディレクトリの中身が以下のようになってます。

1_X.jpg  
2.jpg  
3.jpg  
4_X.jpg  
5.jpg  
.  
.  
.

ファイル名は常に" ** _.jpg"か、"_** _X.jpg"になってます。  
これを全て***_X.jpgにしたいです。  
つまり"_X"がついてない全てのファイル名に"_X"を付与してあげたいです。

どのようにすればいいでしょうか。


CC BY-SA 4.0
2018-10-28T15:22:18.753
49737
2018-10-29T12:24:00.397
2018-10-29T00:55:46.753
3060
29725
question
unix
ターミナルコマンド ファイル名の末尾に一定の文字列を加える


こんな`shellscript`はいかがでしょうか？

[code]

    #!/bin/sh
    
    while [ -n "$1" ]
    do
        fullname=$1
        extension=${fullname##*.}
        filename=${fullname%.*}
        suffix=${filename##*_}
        if [ "$suffix" != "X" ] ; then
            mv ${filename}"."${extension} ${filename}"_X."${extension}
        fi
        shift
    done
    
[/code]

コメントにある@metropolisさんの回答でも充分かも知れませんが、  
上記をファイルに保存し、試しにjpegファイルとおなじディレクトリーに保存して、`chmod +x 755
ファイル名`というコマンドを実行した後、`./ファイル名 *.jpg`としてみてください。期待の結果が得られると思います。

実行が確認出来ましたら、`Terminal`から、

[code]

    mkdir -p /usr/local/bin
    sudo cp ファイル名 /usr/local/bin
    
[/code]

と、2つのコマンドを実行し、システムを汚さない実行ファイル起き場にコマンドを移動します。  
あとは、お使いのshellがbashでしたら（通常はこのシェルが使われています）`お好みのエディター ~/.bashrc`で

[code]

    PATH=/usr/local/bin:$PATH
    
[/code]

という行を探し、なければ追加して下さい。  
これで、次に`Terminal`を開いたら、どのディレクトリーからでも`ファイル名
*.jpg`でjpegファイルの末尾に`_X`が付いていなければ`_x`を追加するコマンドを実行出来ます。

`while [ -n "$1" ]`から`done`直前の行で`shift`すると、  
引数を順次処理してくれ、応用が利くので憶えておいて損はないと思います。


CC BY-SA 4.0
2018-10-28T23:22:00.583
49741
2018-10-29T12:24:00.397
2018-10-29T12:24:00.397
14745
14745
49737
answer


`find`で該当するファイルを探してリネームすることもできます。

[code]

    find . ! -name *_X.jpg -type f -execdir sh -c 'mv "$1" "${1%.jpg}_X.jpg"' _ {} \;
    
[/code]


CC BY-SA 4.0
2018-10-29T03:33:35.197
49749
2018-10-29T03:33:35.197
25936
49737
answer