回答:
他の人が述べたように、これrename
は得意man rename
ですが、試す前にマニュアルページ()を読んでください。少なくとも2つのまったく異なるツールがありrename
、どちらを使用するかはディストリビューションに依存します。それらを誤って呼び出すことは危険です。
Ubuntuに同梱されているLarry Wallによるperlベースのバージョンのmanページは次のとおりです。次のようなperl式を与えますrename 's/\.sql$/.php/' *.sql
古いRed HatおよびCentOSディストリビューションに同梱されている名前変更のマニュアルページを次に示します。使い方は次のような単純な文字列置換ですrename .sql .php *.sql
bashワンライナーを使用して、各ファイルを1つずつ処理することもできます。
$ for f in *.sql; do mv -i "$f" "${f%%.*}.php"; done
rename
機能(すなわちbusyboxの)
がありrename(1)
、正規表現を使用しませんが、問題を解決できます。
rename .sql .php *.sql
もありますmmv(1)
が、私はそれがどのように機能するかについてはよく知りません。
/usr/bin/rename
リンクし/usr/bin/prename
ます。
G'day、
また、入力してみることができます
for i in $(\ls -d *.sql)
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done
または、正規表現を使用するには、わずかに変更します
for i in $(\ls -d | egrep -e '.*\.sql')
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done
ちょっとしたシェルコーディングの楽しみ。(-:
sed
例はいえ、かなり良いです。
配管工なので、私はパイプが好きです:)
注:この答えは冗長です-初心者として、知っている人が説明するのに時間がかかると感謝します。あなたが初心者ではない場合、長さと冗長性を言い訳してください。
ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/' | bash
どこで:
ls -1 *_201[67][0-9]*
パターンに一致するすべてのファイルをリストします。この場合、ファイル名に「YYYYMMDD」の形式の日付を持つファイルを探しています。
sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'
# : | | | | | | | |: :
# : |^2....^ ^3..................^^4.......^ |: :
# :^1..............................................................^: :
# /................filename.................pattern................./...mkdir...and....mv...command.../
^ 1:最初のキャプチャグループ-ファイル名全体
^ 2:2番目のキャプチャグループ-ファイル名パターンの最初の部分
^ 3:3番目のキャプチャグループ-2番目のファイル名部分-ここでは、「YYYYMMDD」としての日付
^ 4:4番目のキャプチャグループ-日付と拡張子の間のオプションのファイル名部分、および拡張子自体
Sooooo ....という名前のファイルがある場合
CallLog_555123412_20161231-214403.7z
...そして
mkdir -p \2\/\3; mv \1 \2\/\3\/\1
実際に
# make directory and sub-directory
mkdir -p CallLog_555123412/20161231
# move file from current directory to sub-sub-directory just created
mv CallLog_555123412_20161231-214403.7z CallLog_555123412/20161231/CallLog_555123412_20161231-214403.7z
sedコマンドの出力は、「bash」にパイプされて実行されることに注意してください。最初に提案されたファイルが実際に移動せずに移動することを確認するには、最初に '|を削除します 最後にbashし、次のように試してください:
ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'
これはまったく変更を行いませんが、 '|で実行すると実行されるコマンドが表示されます。最後にタグ付けされたbash。
これは、ファイル名の一部から任意のサブディレクトリ、またはsedコマンドの「置換」テキストに追加する他のものを作成できるため便利です。ただし、sedには多くのエスケープ文字が必要です。
SED正規表現ブラケット:
(...)キャプチャグループ化のためにエスケープが必要-> \(... \)
{m、n}は、前のオブジェクトを定量化するためにエスケープする必要があります-> \ {m、n \}
/置換文字列でエスケープする必要があります-> \ /
[...]文字クラスのエスケープは不要です
置換文字列の\ 1は、最初にキャプチャされたグループなどを指します...
セキュリティ警告:結果を完全に理解している場合を除き、パイプを「バッシング」しないでください...
いくつかの閉塞を解消するのに役立つことを願っています:)