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表現をサポートするshopt
Bashを使用しているでしょう。設定すると、現在のディレクトリのサブディレクトリでも一致するすべてのファイルに展開されます。**/
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 はスペースを破るのではなく、配列要素の境界を追跡します。 [[]]テストの後のセミコロンもオプションです。