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
には他のファイルもいくつかあります。
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.
/ tmpおよびサブディレクトリの下のすべてのファイルを.txt拡張子から.cpp拡張子に再帰的に置き換えるために作成した小さなスクリプト
#!/bin/bash
for file in $(find /tmp -name '*.txt')
do
mv $file $(echo "$file" | sed -r 's|.txt|.cpp|g')
done
再帰的に名前を変更するには、次のコマンドを使用します。
find -iname \*.* | rename -v "s/ /-/g"
bashの場合:
shopt -s globstar nullglob
rename _dbg.txt .txt **/*dbg*
上記のスクリプトは1行で記述できます。
find /tmp -name "*.txt" -exec bash -c 'mv $0 $(echo "$0" | sed -r \"s|.txt|.cpp|g\")' '{}' \;
これは以下で使用できます。
rename --no-act 's/\.html$/\.php/' *.html */*.html
名前を変更したいだけで、外部ツールを使用してもかまわない場合は、 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