シェルスクリプトを使用して、.inで終わるファイルとその.outを一覧表示します。

シェルスクリプトを使用して、.inで終わるファイルとその.outを一覧表示します。

別の拡張子で終わるファイルでいっぱいのディレクトリがあります。.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/'

関連情報