現在lsの出力を別のコマンドに「コピー/貼り付け」する最も効率的な方法は何ですか?

現在lsの出力を別のコマンドに「コピー/貼り付け」する最も効率的な方法は何ですか?

このような状況が発生しました。たくさん:

  1. 私は大きなディレクトリにあり、正確な名前を忘れた特定のファイルを探していて、lsその中のすべてのファイルを見るために入力しました。

  2. 欲しいファイルが見えます

  3. このファイルをコマンドラインにパラメータとして渡す必要があります。ファイル名が複雑です。

現在私がやっていることは、lsカーソル/マウスで出力を強調表示して右クリックし、[コピー]をクリックしてコマンドラインプロンプトに貼り付けるだけです。もっと良い方法があればこれを避けたいです。タブのオートコンプリートについて知っていますが、時には abcd abce abcf abcg abcz23 タイプファイルと同じ場合があります。たとえば、出力をクリップボードにコピーできますが、他のlsファイル名もクリップボードにコピーしないように、必要なファイルに絞り込む方法が必要です。

答え1

確認するfzf、これは大きなリストで一致するものを見つけるのと同じ作業に最適です。

# Launches an interactive selector listing all the contents of the current
# directory and prints the selected item, storing it in $result
$ result=$(ls | fzf)

答え2

使用できるバッシュselect建設*必要なファイル名が含まれると確信している「無料」ワイルドカードパターン()を使用してください。

目的のディレクトリ(またはワイルドカードを含むフルパス)に変更したら、次の手順を実行します。

select mine in *
do
  your-command "$mine"
done

目的のファイルに対応する番号を入力すると、bashはそのファイル名を引数としてコマンドを実行します。泡を出し、すすぎ、数回繰り返し、Ctrl-Dを押してサイクルを終了しますselect。もちろん、ファイル名についてもっと知っていれば、ワイルドカードを強化できます。

これにより、selectマウスを使用したコピー/貼り付けによって、危険な可能性のある誤ってファイル名が拡張または分割されるのを防ぐことができます。前者の場合はab、2つのファイルを含むディレクトリを検討してくださいab*。このファイルをコピー/貼り付けるとab*取得できます。両方まずファイルをab返してください!後者の場合は、3つのファイルab" a b"を含むディレクトリを検討してください。 ''ファイルをコピー/貼り付けようとするとa b通過します。その他ファイルab

入力が多すぎると、「1行」に変換できます。

select mine in *; do your-command "$mine"; done

答え3

Bashを使用している場合は、電話をかけることができますedit-and-execute-command(マンページを参照)。これにより、bashはユーザーが選択した方法で現在のコマンドラインを開きます$VISUAL$EDITORその後、エディタを使用してlsの出力を取得できます。

これは構成によって大きく異なりますが、C-xC-e基本的に行われます。 bashをviモードに設定すると、esc vこれが行われます。

bashはエディタを保存して編集するときにこのコマンドを実行します。

他のシェルにも同様の機能があります。

答え4

警告する

lsこの答えは出力が推奨されていないパイプラインに依存するため、予期しない結果が生じる可能性があります。詳細については、下にスクロールしてラベル付きのセクションを確認してください。編集2

コマンドの置き換え

コマンドの置き換え $(command)サブシェルを作成し、サブシェルでコマンドを実行し、サブシェルの出力をメインシェルに返します。

構文は次のとおりです。

main_command_to_run $(ls | grep 'name_of_file')

(少なくとも私にとって)一般的なユースケースは、tar.gzファイルを解凍するときです。

tar -xvzf $(ls | grep 'tar')

一部のコンテキスト - この場合、現在のディレクトリにtarファイルが1つしかないことがわかっているため、tar.gzファイルのフルネームを入力する必要はありません。

もちろん、ls | grep 'name_of_file'ファイル名が一意であると確信していない限り、最初に1つの結果しか出てこないかどうかをテストするために実行するのが最善です。

編集1

@roaimaが指摘したように、ファイル名にスペースが含まれている場合は、式に二重引用符を追加する必要があります。 main_command_to_run "$(ls | grep 'name_of_file')"

ワイルドカード(ワイルドカード)の使用

この構文を使用するのではなく、$(ls | grep 'name_of_file')ワイルドカードを使用することです。そのうち「?」、「*」、「[]」などのワイルドカード文字他の人文字を一致させるために使用されます。

ゼロ個以上の文字に一致するワイルドカード文字であるアスタリスク(「*」)を使用する例を示します。したがって、@roaimaが親切に提供したように、「foo.tar.gz」というファイルの可能なユースケースは次のとおりです。
tar -xvzf *.tar*

編集2

ls@Hermannも指摘したように、パイプ出力はさまざまな理由で信頼できません。理由の説明については、以下のリンクを参照してください。
リンク1
リンク2
リンク3
リンク4

関連情報