.txt
削除やファイルを一行で書きたいです。.csv
私のディレクトリには何がありますか?
tachomi$ ls
file1.csv file1.sql file1.txt file2.csv file2.sql file2.txt
ファイルだけが必要なのですが、or .sql
のような論理演算子を使って一行にコマンドを実行する方法がないかと思います。AND
OR
tachomi$ rm *.txt AND *.csv
tachomi$ rm *.txt OR *.csv
与えられた2つのパターンに一致するすべてのファイルを削除する方法
答え1
簡単に:
rm *.txt *.csv
シェルが中括弧拡張をサポートしている場合は、次のことができます。
rm *.{txt,csv}
答え2
*.txt
両方のパターンのいずれかに一致するファイル、つまりANDに一致するファイル*.csv
、つまりORに一致するファイルを一致させるには、*.txt
両方のパターンを一覧表示します*.csv
。 (定量子と論理演算子の入れ子が重要です!)
rm *.txt *.csv
どちらのパターンもファイルと一致しないと変更されていないため、名前またはファイルが見つからないと文句を言いrm
ます。苦情を避ける一般的な方法は、存在しないファイルを自動的に無視することを使用することです。*.txt
*.csv
rm -f
rm -f *.txt *.csv
パターン1とパターン2の両方に一致する文字列に一致する演算子はありません。この場合、両方とも一致する*.txt
文字列がとにかく存在しません*.csv
。
kshでは、orに一致する文字列をパターン化@(*.txt|*.csv)
または一致させます。*.@(txt|csv)
最初に実行している場合はbashでこのモードを使用でき、最初に実行している場合はzshで使用するか、zshのデフォルト構文を使用できます。複合パターンに一致するファイルがない場合は、そのままコマンドに渡されます。 ATT ksh に (mksh、bash、または zsh 以外の ATT ksh のみ) パターンに一致するファイルがない場合は、空のリストとして拡張を使用できます。不足している引数について文句を言わないように、まだ使用する必要があります。*.txt
*.csv
shopt -s extglob
setopt ksh_glob
*.(txt|csv)
~(N)*.@(txt|csv)
rm -f
rm -f ~(N)*.@(txt|csv)
Bash では、shopt -s nullglob
最初に実行して、一致しないすべてのパターンを空のリストに展開します。
shopt -s nullglob extglob; rm -f *.@(txt|csv)
zshではN
glob修飾子を使用するか、setopt nullglob
最初に実行してください。
rm -f *.(txt|csv)(N)
setopt nullglob extglob; rm -f *.@(txt|csv)