別の拡張子で終わるファイルでいっぱいのディレクトリがあります。.in
そのファイルと.out
同じ基本名を共有するファイルのみをリスト/選択するにはどうすればよいですか?
例えば
file1.txt
file1.in
file2.in
file3.in
file2.out
file3.out
これらのファイルの中から私が選びたいのは次のとおりです。
file2.in
file2.out
file3.in
file3.out
答え1
.in
とペアリングしたいので、.out
繰り返して*.in
そのファイルがあることを確認し.out
、そうであれば両方を印刷してください。
for f in *.in; do
if [[ -f ${f%.in}.out ]]; then
echo $f
echo ${f%.in}.out
fi
done
答え2
まず、すべてのファイルを一致させ、.out ファイルが存在することを確認し、名前を印刷します。
for x in *; do
if [[ "$x" =~ ^(.*)\.in ]] && [[ -f ${BASH_REMATCH[1]}.out ]];then
echo -n "$x ${x%%.in}.out ";
fi
done
echo
答え3
zshを使う:
has_out() [[ -e $REPLY:r.out ]]
ls -ld -- *.in(+has_out)
答え4
これらのファイルのすべてを一覧表示し、拡張子を削除し、重複した項目をフィルタリングして印刷できます。
$ ls | grep '\(\.in\|.out\)$' | sed 's/....$//' \
| sort | uniq -c | grep '^[\t ]*2' | sed 's/^[\t ]\+2 //'
利点:
- バッシュは必要ありません。
- 高価な作業(ディレクトリリストの作成)を1つだけ実行します。つまり、必要ありません。統計(2)各ファイル(例
[[ -f ... ]]
:)
ls
出力がすでにアルファベット順にソートされている場合は、sort
このコマンドをパイプラインから削除できます。 POSIXがそれを指定しているかどうかはわかりませんls
。
.in
このパイプは、拡張子が..のファイルのすべてのデフォルト名を印刷します.out
。
後で対応するファイルのリストが必要な場合は、以前にフィルタリングした拡張子のサフィックスをリストに追加する必要があります。たとえば、
$ ls | grep '\(\.in\|.out\)$' | sed 's/....$//' \
| sort | uniq -c | grep '^[\t ]*2' \
| sed -e 's/^[\t ]\+2 //' -e 's/$/.in/ ; p; s/in$/out/'