execを検索 - {}でファイル名の一部のみを使用する

execを検索 - {}でファイル名の一部のみを使用する

次のディレクトリ構造があります。

├── file1.json
├── file2.json
└── file3.json

.jsonサフィックスを削除したいです。おそらく最良の方法はrenameコマンドを使用するか使用することですが、コマンドでこれを行うことができるかどうか疑問にfor-loop思います。find

たとえば、接続は.json簡単です。次のコマンドを実行します。

find . -type f -name 'file?' -exec mv {} {}.json \;

しかし、今、命名プロセスを元に戻したいのですが、どうすればよいですかfind

ベストアンサー1

.json.for example file1(match Pattern)を追加して初期プロセスのfile?名前を変更しますfile1.json。 Reverseはより複雑で、少しのシェルスクリプトが必要です。

find . -type f -name 'file?.json' -exec sh -c 'mv -- "$1" "${1%.json}"' _ {} \;

これはsh見つかった各ファイルに対して呼び出されますfind。複雑さをほとんど増やすことなく、より効率的なプロセスを作成できることがよくあります。

find . -type f -name 'file?.json' -exec sh -c 'for f in "$@"; do mv -- "$f" "${f%.json}"; done' _ {} +

両方のソリューションは、対応${var%suffix}する値を返し、$varその値の末尾からリテラルテキストを削除するPOSIXシェルの置き換えを使用します(可能な場合)。suffix

var=hello.txt
echo "${var%.txt}"    # "hello" because ".txt" is removed
echo "${var%.zzz}"    # "hello.txt" because there is no ".zzz" suffix
echo "$var"           # "hello.txt" because the variable itself is unchanged

おすすめ記事