1. ホーム
  2. linux

[解決済み] Linuxで複数のファイルを検索し、名前を変更する

2023-05-01 20:50:10

質問

私は、以下のようなファイルを持っています。 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

このコマンドは再帰的に実行されないので、すべてのサブディレクトリのファイル名を変更するようにするにはどうしたらよいでしょうか。例えば XXYY 私は、名前が予測できない非常に多くのサブディレクトリを持つことになります。また、私の CURRENT_FOLDER はまた他のファイルを持つことになります。

どのように解決するのですか?

この場合 find を使うと、マッチする全てのファイルを再帰的に見つけることができます。

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


EDITです。 というのは '{}'\; は?

-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.