web-dev-qa-db-ja.com

mvのようなLinuxコマンドがありますが、正規表現はありますか?

例えば、私はmv (.*?).sql $1.phpにしたい、

名前変更パターンを指定できるコマンドはありますか?

43
JoshRibs

他の人が述べたように、renameはこれが得意ですが、試す前にmanページ(man rename)を読んでください。 renameと呼ばれる完全に異なる2つ以上のツールがあり、どのツールを使用するかはディストリビューションによって異なります。それらを誤って呼び出すと危険な場合があります。

これはmanページです Ubuntuに同梱されているLarry WallによるPerlベースのバージョン用。あなたはそれにrename 's/\.sql$/.php/' *.sqlのようなPerl式を与えます

これはmanページです 古いRed HatおよびCentOSディストリビューションに同梱されている名前変更用です。使い方はrename .sql .php *.sqlのような単純な文字列置換です

Bashワンライナーを使用して、各ファイルを一度に1つずつ処理することもできます。

$ for f in *.sql; do mv -i "$f" "${f%%.*}.php"; done
32
Ryan Bright

正規表現を使用しない rename(1) がありますが、問題を解決できます。

_rename .sql .php *.sql
_

mmv(1) もありますが、私はそれがどのように機能するのかよく知りません。

10
Adam Rosenfield

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

シェルコーディングのちょっとした楽しみのために。 (-:

5
Rob Wells

配管工なので、パイプが好きです:)

注:この答えは冗長です-初心者として、知っている人が説明に時間をかけると感謝するので、「前払い」で支払います。初心者でない場合は、長さと冗長さをお許しください。

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 Regexブラケット:

(...)キャプチャグループのエスケープが必要-> \(... \)

{m、n}は前のオブジェクトを数量化するためにエスケープが必要->\{m、n \}

/置換文字列でエスケープする必要があります->\/

[...]文字クラスのエスケープは必要ありません

置換文字列の\ 1は最初にキャプチャされたグループを参照し、以下同様に続きます...

セキュリティ警告:結果を完全に理解するまでは、決して「バッシング」するために何もしないでください...

いくつかの閉塞を取り除くのに役立つことを願っています:)

2
skeetastax

mmvをインストールして、次のようにします。

mmv "*.sql" "#1.php"
1
Gepsens