4

GNU 並列 ( http://www.gnu.org/software/parallel/ )を使用して中括弧 (中括弧) に問題があります。

4 つのファイルのリストがあります。

file1.txt.super
file2.txt.super
file3.txt.super
file4.txt.super

私が発行した場合:ls * | parallel "mkdir ./{.}"

次の 4 つのディレクトリが返されます。

file1.txt
file2.txt
file3.txt
file4.txt

私の質問は、次の 4 つのディレクトリを単純に返すにはどうすればよいかということです。

file1
file2
file3
file4

http://www.linuxjournal.com/article/8919を読みましたが、これらの正規表現を gnu parallel で実装できませんでした。ここで何かが足りないと思います。また、より複雑な正規表現を使用した例は非常に高く評価されます。

4

6 に答える 6

6

はい、ここで何かが足りないようですlinuxjournalの記事では、シェルパラメータ拡張の機能について説明しています。これらの中括弧(常に前に)は、偶然に中括弧を使用するユーティリティのデフォルトの置換文字列$とは無関係です。並列ドキュメントは、コマンドラインオプションにより、中括弧で囲まれたデフォルトの代わりに任意の文字列を使用できることを示しています。parallel

たとえば、例の置換文字列 {.}を次のように変更できます。%foo

ls * | parallel --extensionreplace %foo "mkdir ./%foo"

${…}linuxjournalの記事の詳細については、このman bashページの「 パラメーター拡張」セクションを参照してください。

@AdamLissの回答に対するコメントで質問したので、中括弧--colsepパラメーターを(ab)使用してタスクを実行する方法を次に示します。

ls * | parallel --colsep '\.' "mkdir ./{1}"

注:この--colsep トリックsed@AdamLissによって提案されたものなど)は、ファイル名に3つ以上のピリオドが含まれている場合(パス名が最初のピリオドで切り捨てられるため)、望ましくない結果を生成します。

ただし、--colsepパラメータは正規表現であるため、これはファイル名の他の場所のピリオドに対して回復力があるはずです。

ls * | parallel --colsep '\.[^\.]*$' "mkdir ./{1.}"

注:--extensionreplace現在の(21120422)バージョンの並列のバグのために機能していません。ただし、parallelはperlスクリプトであるため、次のように変更することで修正できます。

    "extensionreplace|er" => \$::opt_U,

    "extensionreplace|er=s" => \$::opt_U,
于 2012-04-25T04:20:08.700 に答える
3

を使用してもかまわない場合はsed、次の回避策があります。

ls * | sed 's/\..*//' | parallel "mkdir ./{}"
于 2012-04-20T00:45:00.673 に答える
2

これはあなたのために働くかもしれません:

ls * | parallel echo {.} | parallel mkdir {.}
于 2012-04-24T18:55:51.140 に答える
1

マニュアルページの例によると、以下は正確に美しいとは言えませんが、うまくいくはずです:

ls *.txt.super| parallel --er {txt} 'echo {txt}|parallel "mkdir ./{.}"'

2 番目のファイル拡張子を削除するには、parallel から parallel を呼び出し、{.}文字列を{txt}parallel の親インスタンスにエイリアスします。

于 2012-04-23T00:13:58.010 に答える
1

「.super」が何であるか、並列実行時にどこに行くのか、または並列コマンドでの「{.}」の使用がわかりません。私の知る限り、 parallel は xargs のように機能し、 のみを理解し{}ます。私は何が欠けていますか?

いずれにせよ、for ループを使用して目標を達成します。

for f in *; do mkdir "${f%%.*}"; done

または、この短いジョブの並列処理が本当に気になる場合:

for f in *; do mkdir "${f%%.*}" & done
于 2012-04-22T23:44:20.593 に答える
1

ここでのすでに優れた回答に加えて、最も簡単な解決策(おそらく@Steveが探していたもの)は次のとおりです。

ls * | parallel --plus mkdir {..}

gnu 並列{.} 置換文字列は、文字列を最も外側の文字に「切り詰める」ことを意図しています。弦は3段まで絞れると思います。..

これは、{.}が 1 レベルのみを にトリムダウンしfile1.txt{..}2 レベルをfile1{...}トリムダウンし、3 番目のレベルをトリムダウンすることを意味します。

于 2021-02-18T15:41:05.300 に答える