フォルダとサブフォルダにIfステートメントを使用する[閉じる]

フォルダとサブフォルダにIfステートメントを使用する[閉じる]

IF文の使用に問題があります。

ディレクトリがスクリプトに渡され、そのディレクトリ(サブフォルダの数に関係なく)にはファイルが含まれます。.txt最終的な.tmp目標は、.tmpすべてのファイルをあるフォルダにコピーし、.txtファイルを別のフォルダにコピーすることです。

現在、以下があります。

shopt -s nullglob
if [[ -n $(echo *.txt) ]]; then

elif [[ -n $(echo *.tmp) ]]; then

else
    echo "nothing Found"
fi

ただし、サブディレクトリは確認されません。何か抜けたものはありますか?

答え1

次のコマンドを使用する必要がありますfind

find "$start_dir" -type f -name '*.txt' -exec cp -t "$txt_destination" '{}' +
find "$start_dir" -type f -name '*.tmp' -exec cp -t "$tmp_destination" '{}' +

答え2

ただし、サブディレクトリは確認されません。何か抜けたものはありますか?

さて、通常のglobはサブディレクトリに再帰されません。あなたがそれを使用しているので、おそらくそれを設定する限り、再帰的なglob表現をサポートするshoptBashを使用しているでしょう。設定すると、現在のディレクトリのサブディレクトリでも一致するすべてのファイルに展開されます。**/shopt -s globstar**/*.txt*.txt

答え3

ikkachuはbashで再帰的なグロービングが可能ですが、方法は説明しません。それでは方法を紹介します。

shopt -s globstar extglob nullglob
txt_files=(**/!(*test*|*sample*).txt)
if (( ${#txt_files} )); then
    cp -t "${txt_files[@]}" $txt_destination
fi

tmp_files=(**/!(*test*|*sample*).tmp)
if (( ${#tmp_files} )); then
    cp -t "${tmp_files[@]}" $tmp_destination
fi

私の記憶が正しい場合、zshは10年以上これを行うことができました。 Bashの代わりにzshを使用する場合:

setopt extendedglob
txt_files=( **/*.txt~*(test|sample)*(N.) )
if (( $#txt_files )) cp -t $txt_files $txt_destination

tmp_files=( **/*.tmp~*(test|sample)*(N.) )
if (( $#tmp_files )) cp -t $tmp_files $tmp_destination

またはそれ以上のCスタイル:

setopt extendedglob nullglob
txt_files=( **/*.txt~*(test|sample)*(.) )
if [[ $#txt_files != 0 ]] {
    cp -t $txt_files $txt_destination
}

tmp_files=( **/*.tmp~*(test|sample)*(.) )
if [[ $#tmp_files != 0 ]] {
    cp -t $tmp_files $tmp_destination
}

私はそこに引用符を忘れませんでした。 zsh はスペースを破るのではなく、配列要素の境界を追跡します。 [[]]テストの後のセミコロンもオプションです。

関連情報