スクリプトで絶対パスとスペースを含むパス内のすべてのファイルを一覧表示する方法

スクリプトで絶対パスとスペースを含むパス内のすべてのファイルを一覧表示する方法

パスをパラメータとして受け入れ、パス内のすべての.mkvファイルを処理するスクリプトを作成しています。パスは絶対パス、相対パス、または単一ファイルにすることができます。ただし、繰り返しファイルの絶対パスがまだ必要です。

これまで私がしたことは次のとおりです。

#!/bin/bash

path=$1
if ! [ -e "$path" ]; then
  path=$(pwd)
fi

find "$path" -type f -name '*.mkv' | sort | xargs realpath | while read file; do
  echo "Processing $file"
done

これは、パスおよび/またはファイルにスペースがない場合に機能しますが、スペースによって失敗します。

正しいアプローチは何ですか?

ベストアンサー1

そしてzsh

#! /bin/zsh -
for file (${${1-.}:P}/**/*.mkv(ND.))
  print -r processing $file
  • ${1-.}Bourneシェルのように、.if $1is not setに拡張されます(if $#== 0; ifが悪いインタフェースであり、$1isが存在しないファイルではありません。これはユーザーにとって大きな驚きです)。
  • ${param:P}realpath()その拡張に拡張されます。**/シンボリックリンクに従わずに.修飾子は選択のみを行うため、すべてのファイルに対して同じことを行う必要はありません。定期的なファイルなのでシンボリックリンクではありません。
  • **/すべてのレベルのサブディレクトリと一致
  • Nnullglob、Ddotglob.のGlob修飾子定期的なただ。

おすすめ記事