ファイル名に基づいて配列を作成しようとしていますが、スペースに問題があります。これは非常に一般的なようです。しかし、私が知っている限り、引用符は正しく設定され、配列がどのように構成されているかを推測します。
to_dump="$(find . -maxdepth 1 -print0 )"
to_dump_array=($to_dump)
read -p " -> " final
case "$final" in
a) for drop in "${to_dump_array[@]}" ;
do cp "$drop" --recursive --force Destination_Folder && \
echo "dropped \"$drop\" ;
done ;;
b) echo "Won't drop anything" ;;
esac
クエリクエリで配列を作成するより良い方法があるべきだと思います。また、私はまたどこに間違っていますか?
ベストアンサー1
-print0
$(...)
bash変数の文字列はnullで終わるため、置換に使用しないでください。
私はこの質問が尋ねるのと同じ答えで質問しました。https://stackoverflow.com/a/30469553/1091693
次の答えをあなたの質問に合わせて調整してください。
to_dump=()
while IFS= read -r -d ''; do
to_dump+=( "$REPLY" )
done < <(find . -maxdepth 1 -print0)
その後、名前付き配列が作成され、to_dump
このread
コマンドを使用して配列からNULLで区切られた要素を読み取りますfind
。ここでパイプの代わりに使用する理由は、< <(...)
配列が変更されるのを防ぐ暗黙的なサブシェルを避けるためです。
元のfind
コマンドに1つが必要な場合-mindepth 1
や、.
再帰的にコピーする(現在のディレクトリ)を選択することができることは注目に値します。
私は-maxdepth 1
findのための引数として使用したことがわかりました。おそらくこれはもっと役に立つでしょう:
shopt -s nullglob
to_dump=( * .[!.]* ..?* )
避けてくださいfind
。これはbash組み込みのみを使用し、フォークせず、ほとんど非常にきれいです。
最初の行shopt -s nullglob
は、このオプションを有効にするbash(-only)コマンドですnullglob
。オプションは以下に説明されていますman 1 bash
。
設定されている場合、bashは、どのファイルとも一致しないパターン(上記のパス名の拡張を参照)を、自分ではなく空の文字列に拡張することを許可します。
簡単に言えば、入力したファイルが*
ファイルと一致しない場合は削除されます*
。デフォルトの動作は*
、とにかくそのファイルを置くことです。
2行目は配列に3つの球を追加します。
*
: 次から始まらないすべてのファイル.
.[!.]*
.
:1つと1つの非文字で始まるすべてのファイル.
。これは一致.
やディレクトリを避けるためです..
。..?*
..
: 1 つ以上の文字で始まるすべてのファイルです。これを追加する理由は前のglobと同じであり、欠落している場合が含まれます。
Bashはglobを配列定義に拡張し、正しく拡張します。スペースや同様の分割はありません。
nullglobの使用に関する警告:nullglobをオンにすると、カールは引数を渡さなかったと文句を言い、curl google.com/search?q=test
現在のls /var/fasdfasafs*
ディレクトリリストを提供します。これがデフォルトでオンになっていない理由の1つです。