87

a_dbg.txt, b_dbg.txt ...システムのようなファイルがありますSuse 10。これらのファイルから「_dbg」を削除して名前を変更するbashシェルスクリプトを作成したいと思います。

Google は、renameコマンドを使用するように提案してくれました。だから私はでコマンドを実行しrename _dbg.txt .txt *dbg*ましたCURRENT_FOLDER

私の実際CURRENT_FOLDERには以下のファイルが含まれています。

CURRENT_FOLDER/a_dbg.txt
CURRENT_FOLDER/b_dbg.txt
CURRENT_FOLDER/XX/c_dbg.txt
CURRENT_FOLDER/YY/d_dbg.txt

renameコマンド実行後、

CURRENT_FOLDER/a.txt
CURRENT_FOLDER/b.txt
CURRENT_FOLDER/XX/c_dbg.txt
CURRENT_FOLDER/YY/d_dbg.txt

このコマンドを作成してすべてのサブディレクトリ内のファイルの名前を変更する方法は、再帰的に行われません。同様XXに、YY私は名前が予測できない非常に多くのサブディレクトリを持つことになります。また、CURRENT_FOLDER他のファイルもいくつか持っています。

4

10 に答える 10

141

find一致するすべてのファイルを再帰的に見つけるために使用できます。

$ find . -iname "*dbg*" -exec rename _dbg.txt .txt '{}' \;

編集:'{}'とは何\;ですか?

-exec引数は、見つかったすべての一致するファイルに対して find を実行さrenameせます。'{}'ファイルのパス名に置き換えられます。最後のトークン\;は、exec 式の終わりを示すためだけに存在します。

すべてのことは、find のマニュアル ページにうまく説明されています。

 -exec utility [argument ...] ;
         True if the program named utility returns a zero value as its
         exit status.  Optional arguments may be passed to the utility.
         The expression must be terminated by a semicolon (``;'').  If you
         invoke find from a shell you may need to quote the semicolon if
         the shell would otherwise treat it as a control operator.  If the
         string ``{}'' appears anywhere in the utility name or the argu-
         ments it is replaced by the pathname of the current file.
         Utility will be executed from the directory from which find was
         executed.  Utility and arguments are not subject to the further
         expansion of shell patterns and constructs.
于 2013-05-14T11:11:16.717 に答える
23

再帰的に名前を変更するには、次のコマンドを使用します。

find -iname \*.* | rename -v "s/ /-/g"
于 2016-03-28T05:15:33.873 に答える
14

バッシュで:

shopt -s globstar nullglob
rename _dbg.txt .txt **/*dbg*
于 2013-05-14T22:24:21.213 に答える
6

上記のスクリプトは 1 行で記述できます。

find /tmp -name "*.txt" -exec bash -c 'mv $0 $(echo "$0" | sed -r \"s|.txt|.cpp|g\")' '{}' \;
于 2015-07-19T10:04:15.970 に答える
4

名前を変更するだけで、外部ツールの使用を気にしない場合は、rnmを使用できます。コマンドは次のようになります。

#on current folder
rnm -dp -1 -fo -ssf '_dbg' -rs '/_dbg//' *

-dp -1すべてのサブディレクトリに再帰的にします。

-foファイルのみのモードを意味します。

-ssf '_dbg'ファイル名に _dbg を含むファイルを検索します。

-rs '/_dbg//'_dbg を空の文字列に置き換えます。

CURRENT_FOLDER のパスでも上記のコマンドを実行できます。

rnm -dp -1 -fo -ssf '_dbg' -rs '/_dbg//' /path/to/the/directory
于 2016-01-29T13:31:05.280 に答える
0

このコマンドは私にとってはうまくいきました。最初に名前を変更するパッケージをインストールすることを覚えておいてください:

find -iname \*.* | grep old-name | rename -v "s/oldname/newname/g
于 2022-02-05T10:15:44.360 に答える
-3

古典的な解決策:

for f in $(find . -name "*dbg*"); do mv $f $(echo $f | sed 's/_dbg//'); done
于 2015-09-17T18:02:13.853 に答える