同じディレクトリ内のファイル拡張子の検索を制限するには、find またはその他のコマンドを使用します。

同じディレクトリ内のファイル拡張子の検索を制限するには、find またはその他のコマンドを使用します。

複数のサブディレクトリがあるディレクトリがあります。サブディレクトリを1つずつ繰り返しています。次に、CDを使用してディレクトリを変更します。そのサブディレクトリに.partial拡張子を持つファイルがある場合は、ファイル名を保存します。次に、サブディレクトリ名とファイル名の一部を印刷する必要があります。私はこんなことを書いた。

for f in *
do
    if [ -d "$f" ]; then
        cd "$f"
        a=$(find ./ -name "*.partial")
        if [ -e "$a" ];then
            echo -e "$f" "\t" "$a"
        fi
        cd ..
    fi
done

find問題は、私が望ましくない追加のサブディレクトリでファイル拡張子を繰り返し見つけることです。.partial現在のディレクトリに限定するにはどうすればよいですか?

ベストアンサー1

.partial現在のディレクトリに関連付けられている各ファイルのフルパス名のみを出力します。

printf '%s\n' ./*/*.partial

一致するものがない場合、nullglobシェルオプションを設定するとパターン自体は出力されず(空白行はまだ出力されます)、隠された名前も一致します。bashdotglob


以下は、これらのパス名をディレクトリパスとファイル名の部分に分割します。

for name in ./*/*.partial; do
    [ -f "$name" ] && printf '%s\t%s\n' "${name%/*}" "${name##*/}"
done

これにより、現在のディレクトリのサブディレクトリにある.partialすべての名前のサブディレクトリ名とファイル名が印刷されます。.partial

ではbash、隠された名前も一致させる必要がある場合は、シェルオプションを設定する必要があります。dotglob

dirnameこれら2つの引数の置換は、次のように呼び出すことによって実行できますbasename

for name in ./*/*.partial; do
    [ -f "$name" ] && printf '%s\t%s\n' "$(dirname "$name")" "$(basename "$name")"
done

サブディレクトリ名を一度だけ印刷する上記のバリエーションです(これを行うには、ディレクトリパスを削除して各場所引数のファイル名を保持するbashシェルなどの引数拡張が必要です)。${*%%*/}

IFS=$'\t'
for dirname in ./*/; do
    set -- "$dirname"/*.partial;
    [ -f "$1" ] && printf '%s\t%s\n' "$dirname" "${*##*/}"
done

これは各サブディレクトリを繰り返し、*.partial各サブディレクトリのワイルドカードパターンを拡張します。最初の一致が通常のファイル(またはファイルへのリンク)の場合は、サブディレクトリ名を印刷し、その後にパターンと一致する名前を印刷してディレクトリパスを削除します。

おすすめ記事