mvのような正規表現を使用したLinuxコマンドはありますか?


回答:


32

他の人が述べたように、これ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

誰かがperlベースの名前変更のためにWindowsバイナリをアップロードできますか?
-mcandre

Perlバージョンの名前変更では、ファイルシステム間でファイルを移動できません。
lilydjwg

bashのワンライナーには持っていない場合は特に、役に立つrename機能(すなわちbusyboxの)
ARTM

10

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

rename .sql .php *.sql

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


UbuntuおよびDebian(他のディストリビューションについては不明)では、デフォルトで正規表現に/usr/bin/renameリンクし/usr/bin/prenameます。
チャフィンク2009

5

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

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


2
名前に空白を含むファイルでは失敗しますので、注意してください。出力を解析するlsべきではありません
slhck

sed例はいえ、かなり良いです。
ブライトスター14

2

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

注:この答えは冗長です-初心者として、知っている人が説明するのに時間がかかると感謝します。あなたが初心者ではない場合、長さと冗長性を言い訳してください。

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は、最初にキャプチャされたグループなどを指します...

セキュリティ警告:結果を完全に理解している場合を除き、パイプを「バッシング」しないでください...

いくつかの閉塞を解消するのに役立つことを願っています:)


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