次のディレクトリ構造があります。
├── 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