web-dev-qa-db-ja.com

Linuxで複数のファイルを見つけて名前を変更する

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には他のファイルもいくつかあります。

57
rashok

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

/ tmpおよびサブディレクトリの下のすべてのファイルを.txt拡張子から.cpp拡張子に再帰的に置き換えるために作成した小さなスクリプト

#!/bin/bash

for file in $(find /tmp -name '*.txt')
do
  mv $file $(echo "$file" | sed -r 's|.txt|.cpp|g')
done
12
VishnuVardhanA

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

find -iname \*.* | rename -v "s/ /-/g"
12
Gantan

bashの場合:

shopt -s globstar nullglob
rename _dbg.txt .txt **/*dbg*
11
glenn jackman

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

find /tmp -name "*.txt" -exec bash -c 'mv $0 $(echo "$0" | sed -r \"s|.txt|.cpp|g\")' '{}' \;
2
Manh Tai

これは以下で使用できます。

rename --no-act 's/\.html$/\.php/' *.html */*.html
0
井上智文

名前を変更したいだけで、外部ツールを使用してもかまわない場合は、 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
0
Jahid