再帰ディレクトリにある.cで終わるすべてのファイルの名前を変更します。

再帰ディレクトリにある.cで終わるすべてのファイルの名前を変更します。

ディレクトリとサブディレクトリのファイル名(.cファイル)にいくつかの文字列を追加するシェルスクリプトが必要です。

たとえば、lokesh親ディレクトリ、その中にある場合は、サブディレクトリ、内部(、...)、内部(、...)lokesh1です。したがって、スクリプトを実行した後、これを(、...)、...)に変更したいと思います。lokesh2lokesh11.c2.clokesh2a.cb.cx_1.cx_2.c(x_a.c, x_b.c

ベストアンサー1

メモ:以下を作成しながらOpenBSDを使用しており、見つかったファイルのデフォルト名に置き換えられますfind。 GNUの場合、これは見つかったファイルのデフォルト名でもありますが、プレフィックスが追加され、以下の最初のコマンドが役に立たなくなります。 GNUユーザー(Linuxを使用しているほとんどの人と同様)の場合は、下にスクロールしてソリューションの他のバリエーションを見つけてください。-execdir utility {} ';'{}find{}./findfind


名前の前に。この付いたディレクトリの中.cや下のすべてのファイルを探そうとします。lokeshx_

find lokesh -type f -name '*.c' -execdir echo mv {} x_{} ';'

-type fそして式は-name '*.c'関連するすべてのファイルを見つけ、見つかった-execdir mv {} x_{} ';'ファイルの名前を変更します。

この-execdir式は標準ではありませんが、ほとんどの実装でfindこれをサポートしています。-exec指定されたユーティリティが、見つかったパス名の親ディレクトリを作業ディレクトリとして使用して実行されるという点で異なります。したがって、コマンドラインの内容は、名前を変更する{}ファイルのデフォルト名になります(たとえば、フルパス名ではありません-exec)。

一度実行し、echo正しい操作が行われたことを確認したら削除します。これにより、ファイル名が実際に変更されるのをecho防ぐことができます。mv


サポートされていないシステム-execdir(またはOpenBSDと同じではありません-execdir):

find lokesh -type f -name '*.c' \
    -exec sh -c 'for name do echo mv "$name" "${name%/*}/x_${name##*/}"; done' sh {} +

または、より短いが少し効率が低い。

find lokesh -type f -name '*.c' \
    -exec sh -c 'echo mv "$1" "${1%/*}/x_${1##*/}"' sh {} ';'

両方のバリアントは、基本的に同じことを行う短いシェルスクリプトを使用します。

mv "$name" "${name%/*}/x_${name##*/}"

これにより、フルパス名のファイルが$nameプレフィックスが付いた同じディレクトリの新しい名前に移動されます。x_パラメータ置換はパス名の親ディレクトリ${name%/*}と同じで、パス名のデフォルト名(ファイル名部分)を提供します。$( dirname "$name" )${name##*/}$( basename "$name" )

おすすめ記事