~(バックアップファイル)で終わるファイルをリストしないでください。

~(バックアップファイル)で終わるファイルをリストしないでください。

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

私はコマンドを使ってみました:

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

答え1

GNU実装(ほとんどのLinuxシステムで利用可能)には、バックアップを無視するlsオプションがあります。-B

ls --ignore-backups

答え2

ls -l | grep -v ~

これがうまくいかない理由は、チルダがホームディレクトリに展開されるため、grep文字通りのチルダが表示されないためです。 (例えばチルダ拡張に関する Bash マニュアル.) 拡張を防ぐために引用する必要があります。

ls -l | grep -v "~"

もちろん、これはファイル名の中間や出力の他の場所でもチルダのある出力行を削除しますls(ユーザー名、日付などに表示される可能性は低いですが)。チルダで終わるファイルを無視したい場合は、次のものを使用できます。

ls -l | grep -v "~$"

答え3

Bashを使用している場合は有効になっていることをextglob確認してください。

shopt -s extglob

その後、次のものを使用できます。

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

kshglobzshでは、そのオプションを使用するか、独自の拡張globを使用して同じことを実行できます。

setopt extended_glob
ls -d -- ^*~

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

ls -d -- *[^~]

しかし、一般的なアイデアはls --ignore-backups

答え4

他の回答で述べたように、問題があるのは、チルダを引用したりエスケープしなかったためです。

特定のユースケースでは、同様の操作を実行するためにシェルファイル名拡張子を使用しました。私は2003年頃からこのプログラムを使用してきました。つまり、さまざまなタイプのシステムでさまざまなシェル実装で動作することを意味します。 (-Cソートされた列に素敵なマーキングが必要なので、ここでも使用します)

ls -C *[!~]

(もちろん、シェルファイル名拡張子を使用する場合の1つの制限は、(非バックアップ)ファイルが多いディレクトリのために拡張子が使用可能なパラメータリストのサイズを超えることです。ただし、ほとんどの最新システムではこの制限はかなり高いですが、通常250KB以上、時にはそれ以上)

関連情報