回答:
単純な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//:/-}
。
$(echo "$f" | tr ':' '-')
with "${f//:/-}"
を置き換えて、サブシェル、パイプ、および外部プログラム呼び出しを回避できます。これはバシズムだと思いますが、ええ。こちらをご覧ください。
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つまたは数個しかない場合、これにより名前を変更できます。
p="201*"
。old_name=$(ls | grep $p)
。保管し、新しいファイル名を、必要な文字の置き換えで:
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/_\./\./')
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
これはやり過ぎかもしれませんが、この回答に記載されているリンクのスクリプトで特殊文字の名前を変更できます。
for f in
...ループは、ファイルが一致する必要がある現在のディレクトリ内のすべてのファイルを反復処理するループ*:*
です。(一致するdirsで何が起こりますか?)。moveコマンドはmove oldname newnameで、新しい名前はでシェルを実行して生成され$( subshell here )
ます。trが何をするか...-