web-dev-qa-db-ja.com

ファイルの名前を変更して文字を置き換える方法は?

名前に:(コロン)が含まれるファイルのグループがあります。 :-(ダッシュ)に置き換える必要があります。

スクリプトでこれを行う簡単な方法はありますか?

サンプルファイル名:2013-10-11:11:52:08_055456663_045585_.txt

11
Ducky

シンプルな1-linerを実行する必要があります(Posix sh互換シェルを想定):

_for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
_

説明:

  • _for ... in ...; do ...; done_は ループ

  • _*:*_ matches 名前に_:_が含まれる現在のディレクトリ内のすべてのファイルとディレクトリ

  • fは、ループ内のそのような各ファイル名に順番に割り当てられます

  • mv 最初の引数の名前を2番目の引数に変更します。 _-v_(詳細)は、何をするかを出力するように要求します。このオプションは GNU-utils 固有であるため、Linuxでは使用できますがSolarisでは使用できません

  • $(...)サブシェルでコードを実行し、出力を置き換えます

  • echo 引数を標準出力に出力します

  • tr 標準出力を読み取り、指定されたマップに従って文字を変換します

bash を使用している場合、$()を置き換えることにより、余分なシェル($(...))がサブプロセス(tr)で生成されるのを回避できます _${f//:/-}_ を使用します。

17
sds

私の別の投稿で述べたように、renameツールはあなたのためのトリックを行うことができます。 rename s/:/-/ <files to rename>と入力するだけです。これにより、最後に名前を付けたすべてのファイルのすべてのコロンがダッシュに置き換えられます。 e。 2013-10-*

こちら 私の他の投稿へのリンク

6
noggerl

ファイルが1つまたはいくつかしかない場合は、次のように名前を変更できます。

  1. ターゲットとするファイル名のパターンを変数として格納します:_p="201*"_。
  2. 名前を変更する古いファイル名を保存します:old_name=$(ls | grep $p)
  3. 新しいファイル名に必要な文字を置き換えて保存します。

    _new_name=$(ls | grep $p | sed 's/:/_/g')        # Using 'sed'
    
                OR
    
    new_name=$(ls | grep $p | tr ':' '_')           # Using 'tr'
    _

ボーナスクリーンアップ
a。統一のために、ダッシュ(_-_)とコロン(_:_)をアンダースコア(___)に置き換える場合は、次のようにします。

_    new_name=$(ls | grep $p | tr ':-' '_');
_

b。最後の下線(_.txt_の直前)も削除する場合は、_new_name_変数を次のように設定します。

_    new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
_
  1. 次に、必要に応じてファイルの名前を変更します:_mv $old_name $new_name_

注意:mv名前変更操作のファイル名にspacesが含まれていると失敗します。その場合は、次のように適切な変数を引用符で囲みます。
_mv "$old_name" $new_name_ [〜#〜] or [〜#〜] _mv $old_name "$new_name"_ [〜#〜] or [〜#〜] = _mv "$old_name" "$new_name"_


ワンライナー

_1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name

1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name

2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name

3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name
_
1
Dut A.

UNIXプロがbashでこれを行うことができると私は確信していますが、Rubyを使用した私の迅速で汚いバージョンを以下に示します。

path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
  `mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end

path_to_filesを誤った名前のファイルへのパスに設定します。上記のコードをrename.rbというファイルに保存します。

username@machinename$ Ruby rename.rb
1
shupru

これはやり過ぎかもしれませんが、この回答で提供されているリンクにあるスクリプトを使用して、特殊文字の名前を変更できます。

https://superuser.com/a/858671/365691

0
A.Danischewski

renamer を使用:

$ renamer --find ":" --replace "-" *
0
Lloyd