次のディレクトリ構造があります。
├── 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
。しかし、代替案があります。{.}
{/}
find
fd
(時々fdfind
)これを使用すると、以下を実行できます。
fd -e json -x mv -- {} {.}
fd -e json
「execute」を表すjson
拡張子があり、その後にファイル名のプレースホルダと拡張子のないファイル名(同じ文字列に置き換えられます)が続くファイルの検索を示します。-x
{}
{.}
gnu parallel
以前のバージョンの and では ( as {}
) を引用する必要があり'{}'
、この場合、 、 / は特別な意味を持ちます。rc
akanga
fish
{.}
csh
tcsh
zsh -o braceccl
{
}
また、隠しファイル(名前がaで始まるファイルまたは名前がaで始まるディレクトリにあるファイル)は、デフォルトでは無視されますfd
(名前がaで始まるファイルとは対照的に)。そして/ / /に記載されているファイルも無視されます。 ..ファイル; /、/、/オプションが変更されました)およびUTF-8でデコードできない名前(ロケールに関係ありません)を参照してください。find
.
.
.ignore
.gitignore
.git/ignore
.fdignore
-H
--hidden
-I
--no-ignore
-u
--unrestricted