〜(バックアップファイル)で終わるファイルのリストを避けます


20

私の要件は、~(バックアップファイル)で終わるファイルを除く、ディレクトリ内のすべてのファイルをリストすることです。

私はコマンドを使用しようとしました:

ls -l | grep -v ~    

私はこの出力を取得します:

asdasad
asdasad~
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell1.sh~
testshell2.sh
testshell2.sh~
testtwo.txt
testtwo.txt~
test.txt
test.txt~

これらのファイルのみを取得したい:

asdasad
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell2.sh
testtwo.txt
test.txt

で終わるファイルのリストを避けようとしているようです~。これらのファイルは、いくつかのテキストエディターで作成されたバックアップファイルです。
ctrl-alt-delor

使用しているオペレーティングシステム:Gnu / Linux(Debian、Ubuntu、Redhat、Centos、Fedora、Suse、Mint、Archなど)ですか?
ctrl-alt-delor

2
無視したいファイルはEmacsバックアップファイルのようです。Emacsの動作を変更するのはかなり簡単です。そのため、バックアップを場所全体ではなく中央のディレクトリに保存します。emacs.stackexchange.com/questions/33/を
Kilian Foth

申し訳ありませんが、信じられません。ls -l(文字ell)には、リストされた各ファイルの許可、nlinks、所有者、サイズ、およびmodtimeが含まれます。表示する出力はls -1(桁1)で、多くのシステムで-1端末で単一列の出力を生成する必要がありますが、lsパイプ(ここに示すようにgrep)またはリダイレクトされる場合-1は不要で、すでに単一列です。
-dave_thompson_085

@ dave_thompson_085すべてのテキストを切り捨てましたが、ここではファイル名のみを削除しました。それは無関係だと感じたためです。また、これは実稼働システムです(自分のシステムではありません)。だから私はユーザー名、詳細をリストし、それらを漏らしたくない。
-curious_one

回答:


49
ls -l | grep -v ~

これが機能しないのは、チルダがホームディレクトリに展開されるため、チルダがgrepまったく表示されないためです。(例えば、BilのTilde Expansionに関するマニュアルを参照してください。)展開を防ぐために引用する必要があります。

ls -l | grep -v "~"

もちろん、これはファイル名の途中やls出力の他の場所であっても、チルダを含む出力行を削除します(おそらく、ユーザー名や日付などには表示されないでしょう)。チルダで終わるファイルのみを本当に無視したい場合は、使用できます

ls -l | grep -v "~$"

48

GNU実装ls(ほとんどのLinuxシステムにあります)には、そのためのオプションがあります:-Bバックアップを無視します:

ls --ignore-backups

24

bashを使用している場合extglobは、必ず有効にしてください:

shopt -s extglob

次に使用できます:

ls -d -- !(*~)
  • -d ディレクトリの内容を表示しない
  • !(*~) で終わるファイルを除くすべてのファイル ~

zshでは、kshglobオプションを使用するか、独自の拡張グロブを使用して同じことができます。

setopt extended_glob
ls -d -- ^*~

除外するサフィックスは1文字のみなので、最後の文字がチルダではないファイル名と一致させることもできます(これextglobもなしで機能します)。

ls -d -- *[^~]

しかし、一般的な考え方はを使用することls --ignore-backupsです。


12

これは役立つはずです:

ls -l | grep -v '~'  

理由:コマンドが実行される前に〜文字がホームディレクトリに置き換えられます。試して

echo ~

そして

echo '~'

6

他の回答で述べたように、問題が発生する可能性が高い理由は、チルダを引用したりエスケープしたりしなかったためです。

ある特定のユースケースでは、シェルファイル名の展開を使用して同様のことを行いました。2003年頃から使用しています。つまり、さまざまな種類のシステムで非常に幅広いシェルの実装に取り​​組んできました。(ここでは-C、並べ替えられた列に素敵な表示が必要なため使用しています)

ls -C *[!~]

(もちろん、シェルファイル名の展開の制限は、非常に多数の(非バックアップ)ファイルを含むディレクトリが展開によって利用可能な引数リストのサイズを超えることです。ただし、ほとんどの最新のシステムでは、この制限は非常に高く、 250KB以上、時にはそれ以上)


1

ls | grep -v '~$'迅速なソリューションです。lsを使用してすべての(非表示でない)ファイルをリストし、grep with -v(inverted matching、すなわち、exclusion)を使用~して、末尾にチルダ()があるすべての行を除外します($)。

ただし、something1、something2などの名前のファイルがある場合、それは悪いワークフローがあることを示す非常に臭い指標であり、lsの動作を変更するような不器用なハックではなく、ソースで修正する必要があります。

test1とtest2またはtestoneとtesttwoのようなバージョン番号の付いたファイルに名前を付ける場合、本当に必要なのはのようなバージョン管理システムgitです。

これは、複数のファイルの複数のバージョンがあり、すべてのファイル間でバージョン管理を調整する必要がある場合に特に当てはまります。

バージョン管理システムでは、基本的に時間ウィンドウをファイルシステムにオーバーレイできるため、1つのtestファイルのみが表示されますが、内部では(バージョン管理プログラムを介して)すべてのバージョンが検索、取得、復帰、比較などに使用できます。

これを設定すると、それ以降に1,000の変更を加えた場合でも、バージョン管理には使用を開始してからのファイルの履歴があるため、エディターからのバックアップファイルは不要になります。必要に応じて、履歴のタイムラインを「分岐」して、新しいアイデアを試し、時間をさかのぼってから別のアイデアを試すこともできます。


1

多くの答えは正しいですが(@Foon特に「の」が好きです)、名前のリストを取得するのls -lはさまざまな理由で少し足りないことに注意してください。

ファイルを見つけるための適切なツールは、当然のことながらfindです。

その結果の1つは、たとえば「選択ロジック」を単独で処理できることです。

$ find . -maxdepth 1 \( -type f -a \! -name '*~' \) -print

文字通りに言うfind

  1. 現在のディレクトリでファイルを探します。 .
  2. そのディレクトリのレベルでのみ検索します。つまり、再帰しないでください。 -maxdepth 1
  3. そこで、エンティティを探します。

    • タイプのファイル: -type f
    • そして: -a
    • 名前が~:で終わらない! -name *~!ファイル名で一致する次のディレクティブを否定します-name *~)。

    (タイプと名前にマッチ全体を作るためには、それがで括弧だ、論理ユニットとして現れる())。

  4. 見つかった各ファイルの名前を印刷します-print

シェルにとって特別ないくつかの文字をシェルによって解釈されないように保護する必要があります。そのため、括弧とバング、!バックスラッシュがエスケープされ、名前パターン*~が単一引用符で囲まれています。

このfindコマンドは、オプションを使用することにより、非常に強力なミニ言語を備えています。たとえば、ファイルシステムツリー全体を再帰的に処理するように指示されますが、スキャン中に特定のディレクトリを省略します。ファイルのいくつかの属性(作成時間、変更時間、サイズなど)を一致させることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.