bashの練習では、ホームディレクトリ内の重複したファイルをホームディレクトリで検索して削除するスクリプトを作成しようとしました。ここに私のスクリプトがどのように見えるかがあります。このアレイに見つけるの出力を保存しmapfileを使って出力を連想配列に保存する
sumray["$i"]=$(find ~ -name "${Name##*/}" ! -wholename "$Name")
:mapfile -t sumray["$i"] < <(find ~ -name "${Name##*/}" ! -wholename "$Name")
は今どこ
#!/bin/bash
# create-list: create a list of regular files in a directory
declare -A arr1 sumray origray
if [[ -d "$HOME/$1" && -n "$1" ]]; then
echo "$1 is a directory"
else
echo "Usage: create-list Directory | options" >&2
exit 1
fi
for i in $HOME/$1/*; do
[[ -f $i ]] || continue
arr1[$i]="$i"
done
for i in "${arr1[@]}"; do
Name=$(sed 's/[][?*]/\\&/g' <<< "$i")
dupe=$(find ~ -name "${Name##*/}" ! -wholename "$Name")
if [[ $(find ~ -name "${Name##*/}" ! -wholename "$Name") ]]; then
mapfile -t sumray["$i"] < <(find ~ -name "${Name##*/}" ! -wholename "$Name")
origray[$i]=$(md5sum "$i" | cut -c 1-32)
fi
done
for i in "${!sumray[@]}"; do
poten=$(md5sum "$i" | cut -c 1-32)
for i in "${!origray[@]}"; do
if [[ "$poten" = "${origray[$i]}" ]]; then
echo "${sumray[$i]} is a duplicate of $i"
fi
done
done
はもともと、私のラインは以下の通りでした。しかし、私には問題がありました。 1つのファイルに複数の重複がある場合、findによって検出されたすべての場所は単一の値に保存されます。私はmapfileコマンドを使ってこれを修正できると考えましたが、現在は配列に何も保存していません。私は連想配列を使っているという事実と関係がありますか?それとも、私は他の場所でちょうどうんざりしましたか?
bashでは、配列要素は配列(索引付けされているか結合されているかにかかわらず)にすることはできません。 – rici
@rici mapfileは連想配列でも使えますか?私は配列要素がbashの配列ではないことを知っていますが、元の投稿がその配列をどのように引き起こしたかわかりません。 – Alphatron
あなたは 'mapfile -t sumray [" $ i "]';を持っていました。私は、 '' sumray'の '$ i'要素に格納されている配列に行を読み込む以外に、解釈する方法はありませんが、連想配列の要素はスカラーでなければ動作できません。 (もしあなたの意図が 'sumray'をマルチマップにするのであれば、bashはマルチマップを持っていないので、これはうまくいっていません。) – rici