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


11

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

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

サンプルFileName: 2013-10-11:11:52:08_055456663_045585_.txt

回答:


17

単純な1ライナーで行う必要があります(Posix sh互換のシェルを想定):

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

説明:

  • for ... in ...; do ...; doneあるループ

  • *:* 現在のディレクトリ:内の名前にあるすべてのファイルとディレクトリに一致します

  • f ループ内の各ファイル名に順番に割り当てられます

  • mv最初の引数を2番目の引数に変更します。-v(詳細)実行内容を印刷するように要求します。このオプションはGNU-utils固有であるため、Linuxでは使用できますがSolarisでは使用できません

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

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

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

使用している場合はbashのを、あなたは(余分なシェルを産卵回避することができます$())サブプロセス(とtr置き換えることで)$(...)${f//:/-}


+1を使用すると簡単な答えが得られますが、もう少し説明することもできます。たとえば、for f in...ループは、ファイルが一致する必要がある現在のディレクトリ内のすべてのファイルを反復処理するループ*:*です。(一致するdirsで何が起こりますか?)。moveコマンドはmove oldname newnameで、新しい名前はでシェルを実行して生成され$( subshell here )ます。trが何をするか...-
ヘネス

@Hennes:これはスーパーユーザーです -これらの詳細を実際に調べる必要がありますか?まあ、ここに行く
...-sds

いいえ。本当に必要な場合は、+ 1しませんでした。そして、私はそれが何をするのか理解しています。しかし、他の多くの読者にとっては良いことだと思います。
ヘネス

2
$(echo "$f" | tr ':' '-')with "${f//:/-}"を置き換えて、サブシェル、パイプ、および外部プログラム呼び出しを回避できます。これはバシズムだと思いますが、ええ。こちらをご覧ください
evilsoup

@evilsoup Indeed; 小さいデータセットではそれほど違いはありません(読みやすさを好むかもしれません)。私は最近それで少しを得ました。2つの単純な文字列マッサージコマンドが不要になるようにスクリプトを書き直して、実行時間を90%以上簡単に短縮しました。
CVn

6

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

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


1

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

@sdsの方がはるかに優れた答えを提供します。回答を削除する必要がありますか?私はstackoverflowの初心者です。
shupru

1
番号; まだ大きな価値があります。:)
ブラックライトシャイニング

2
この答えにはいくつかの大きな欠点がありますが、それ関連性があり、知る価値があることは間違いありません。(これはまだ有用かもしれませんが、警告とその他すべてに注意してください。)主に、ファイル名に空白(古典的な失敗の場合の改行だけでなく)が含まれていると、ひどく壊れてしまうようです。また、それが空白のためではなかったとしても、シェル呼び出しでファイル名を引用して、ファイル名の他の特殊文字をシェルによる処理から保護する必要があります(Rubyのバックティック演算子がどのように機能するか正確にはわかりませんが)。
CVn

1

ファイルが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

         NB: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

0

名前変更機能を使用する:

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

ファイルの名前を変更するための完全なnode.js環境をインストールするのは少し多すぎると思います。rename多くのLinuxディストリビューションにプリインストールされているツールです。しかし、Windowsの場合、このツールは素晴らしいと思います。
-noggerl

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.