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

答え2

まあ、指示は非常に明確です。

文字列 "{}"は現在処理中のファイルの名前に置き換えられます[...]

findするいいえなどを使用するなど、ファイル名を操作するための追加のプレースホルダを提供しますgnu parallel。しかし、代替案があります。{.}{/}findfd(時々fdfind)これを使用すると、以下を実行できます。

fd -e json -x mv -- {} {.}

fd -e json「execute」を表すjson拡張子があり、その後にファイル名のプレースホルダと拡張子のないファイル名(同じ文字列に置き換えられます)が続くファイルの検索を示します。-x{}{.}gnu parallel

以前のバージョンの and では ( as {}) を引用する必要があり'{}'、この場合、 、 / は特別な意味を持ちます。rcakangafish{.}cshtcshzsh -o braceccl{}

また、隠しファイル(名前がaで始まるファイルまたは名前がaで始まるディレクトリにあるファイル)は、デフォルトでは無視されますfd(名前がaで始まるファイルとは対照的に)。そして/ / /に記載されているファイルも無視されます。 ..ファイル; /、/、/オプションが変更されました)およびUTF-8でデコードできない名前(ロケールに関係ありません)を参照してください。find...ignore.gitignore.git/ignore.fdignore-H--hidden-I--no-ignore-u--unrestricted

関連情報