web-dev-qa-db-ja.com

パス全体を再入力せずにディレクトリ内の複数のファイルを参照する方法はありますか?

Bashシェルで、同じディレクトリにある複数のファイルを削除する必要がある場合、現在は次のようにする必要があります。

_rm /some/path/file1 /some/path/file2_

変数を使用したり、作業ディレクトリを変更したりせずに_/some/path/_を再入力する必要がないように、これを書く短い方法はありますか?

おそらく次のようなものです:

rm /some/path/(file1,file2)

25
user1613254

あなたは近いです:

rm /some/path/{file1,file2}

あるいは

rm /some/path/file{1,2}

関連し、他のシェルによってサポートされている、のようなパターンです

rm /some/path/file[12]

最初の2つは、2つの明示的なファイル名引数に展開されます。 3番目は、/some/path内のすべてのファイルが照合されるパターンです。

43
chepner

または、BashのReadlineライブラリを利用することもできます。これは少し回避策ですが、比較的簡単に入力できます。

  1. ls /some/path/
  2. rm ESC.file1 ESC.file2

(あなたのメタ接頭辞が ESC キー。)

最初のコマンドの余分なlsは、前のコマンドの最後の引数としてパスを履歴に入れます。 ESC. (またはマニュアルの状態M-. あるいは M-_):

前のコマンドへの最後の引数(前の履歴エントリの最後のワード)を挿入します。

したがって、ファイル名の前の最後のパスを効果的に入力しています。 (ls行の末尾のスラッシュに注意してください)。

8
lgarzo

これらの洞察に満ちた答えに加えて、ファイルのグループを照合するために使用できる多数のパターンがあります。 ファイル名展開 および パターンマッチング を使用すると、ディレクトリ内のすべてのファイル、何かで始まるすべてのファイル、同じ拡張子を持つすべてのファイルなどを一致させるようにbashに指示できます。

もちろん、rmを使用している場合は、不要なものを削除しないように十分注意する必要があります。最初にlsを使用して、パス引数が何を表示するかをリストすることをお勧めします。

ここにいくつかの例があります。

  1. ディレクトリ内のすべてのファイルを照合する場合、rmコマンドが処理する内容を確認するには、lsを使用します。アスタリスク(*)グロブ演算子を使用して、任意の文字数に一致させることができます。

    ls /some/path/*
    
  2. または、testで始まるすべてのファイル:

    ls /some/path/test*`
    
  3. Testで始まり、1文字で終わり、.shで終わるすべてのファイルはどうでしょう。疑問符(?)文字を使用して、1文字と一致させることができます。

    ls /some/path/test?.sh
    
  4. test1.shまでの9つのファイルtest2.shtest9.shなどがあり、これらのテストスクリプトを削除するとします。保持したいtesta.shもあります。 testで始まり、1〜9またはアルファベット以外のクラスの番号で始まり、.shで終わるすべてのファイルを検索できます。これらは角かっこ([])を使用して文字のグループを照合します。

    ls /some/path/test[1-9].sh
    ls /some/path/test[!:alpha:].sh
    

これらのような一致はかなり単純にスクリプト化することもでき、自動化のためにスクリプト内のファイルの非常に微調整された、または広範なグループ化を可能にします。

1
user39891

Bashを使用する場合、M-rに次の行を追加することにより、~/.inputrcに最後の引数を繰り返させることができます。

"\er": "!#:$\e^"

!#は現在の行、$は最後の引数、\e^history-expand-lineです。

0
Lri