ディレクトリとサブディレクトリのファイル名(.cファイル)にいくつかの文字列を追加するシェルスクリプトが必要です。
たとえば、lokesh
親ディレクトリ、その中にある場合は、サブディレクトリ、内部(、...)、内部(、...)lokesh1
です。したがって、スクリプトを実行した後、これを(、...)、...)に変更したいと思います。lokesh2
lokesh1
1.c
2.c
lokesh2
a.c
b.c
x_1.c
x_2.c
(x_a.c,
x_b.c
ベストアンサー1
メモ:以下を作成しながらOpenBSDを使用しており、見つかったファイルのデフォルト名に置き換えられますfind
。 GNUの場合、これは見つかったファイルのデフォルト名でもありますが、プレフィックスが追加され、以下の最初のコマンドが役に立たなくなります。 GNUユーザー(Linuxを使用しているほとんどの人と同様)の場合は、下にスクロールしてソリューションの他のバリエーションを見つけてください。-execdir utility {} ';'
{}
find
{}
./
find
find
名前の前に。この付いたディレクトリの中.c
や下のすべてのファイルを探そうとします。lokesh
x_
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" )