4

名前に特定のパターンを含むファイルを編集する必要があります。これらのファイルは、複数の階層ディレクトリに分散しています。

次のように同じことを達成するために、次の助けを借りてfind使用しています。sedxargs

find . -type f -name "file*" | sed -i.bak 's/word1/replace_word1/g'

私の問題は、バックアップ ファイル (* .bak )からの変更を元に戻したいということです。サンプル ディレクトリ ツリーは次のようになります。同じことを達成するためのLinuxコマンド(チェーンの可能性があります)を探しています。

$ tree
.
|-- pdir1
|   |-- dir1
|   |   |-- dir2
|   |   |   |-- file2
|   |   |   `-- file2.bak
|   |   |-- file1
|   |   `-- file1.bak
|   `-- dir3
|       |-- file3
|       `-- file3.bak
`-- pdir2
    |-- file1
    `-- file1.bak

次のコマンドを使用して、すべてのバックアップ ファイルを見つけることができますfind。しかし、次に何をすべきかを理解できません。あなたが私がこれを解決するのを手伝ってくれるなら、それはかなりのことです.

find . -type f -name "file*.bak"

ノート

私はこの問題を一般的なシナリオとして観察しています。私はこれに何度も直面しましたが、小さなラッパースクリプトを書くことで逃げました。ここでは、一般的で簡潔な解決策を望んでいます。

4

2 に答える 2

6

rename1 つのオプションを次のように使用できますfind

find . -type f -name "*.bak" -exec rename 's/\.bak$//' {} \;

foo.bak存在する場合、これは名前を変更しませんfoo。上書きを強制するには、次の-fオプションを使用しrenameます。

find . -type f -name "*.bak" -exec rename -f 's/\.bak$//' {} \;

編集: を使用できない場合はrename、次を試してください:

find . -name "*.bak" -exec sh -c 'mv -f $0 ${0%.bak}' {} \;

上記 (最後の) コマンドの説明: によって返される各結果に対してfind、シェル コマンドが呼び出され、その結果を のパラメータ ( で示される{})として受け取りますmv -f $0 ${0%.bak}$0は位置パラメーターであり、パラメーターの末尾から削除するためのシェル パラメーター展開${0%.bak}を示します。結果として、シェルは command を発行します。.bakfoo.bakmv -f foo.bak foo

于 2013-09-26T16:12:05.253 に答える
1

forディレクトリをたどるループで簡単に復元できます。拡張子のないファイルが存在するかどうかはチェックしませんbak

for f in **/*.bak; do mv -- "$f" "${f%.bak}"; done
于 2013-09-26T16:05:39.473 に答える