Các lệnh sau trong thư mục chứa phông chữ sẽ hoạt động, nếu bạn muốn sử dụng từ bên ngoài thư mục lưu trữ phông chữ, hãy đổi for f in ./*
thành for f in /directory/containing/fonts/*
. Đây là một phương pháp dựa trên shell, nên khá chậm, và cũng không đệ quy. Điều này sẽ chỉ tạo thư mục, nếu có các tệp bắt đầu bằng ký tự trùng khớp.
target=/directory/to/store/alphabet/dirs
mkdir "$target"
for f in ./* ; do
if [[ -f "$f" ]]; then
i=${f##*/}
i=${i:0:1}
dir=${i^}
if [[ $dir != [A-Z] ]]; then
mkdir -p "${target}/#" && mv "$f" "${target}/#"
else
mkdir -p "${target}/$dir" && mv "$f" "${target}/$dir"
fi
fi
done
Là một lớp lót, một lần nữa từ trong thư mục lưu trữ phông chữ:
target=/directory/to/store/alphabet/dirs; mkdir "$target" && for f in ./* ; do if [[ -f "$f" ]]; then i=${f##*/}; i=${i:0:1} ; dir=${i^} ; if [[ $dir != [A-Z] ]]; then mkdir -p "${target}/#" && mv "$f" "${target}/#"; else mkdir -p "${target}/$dir" && mv "$f" "${target}/$dir" ; fi ; fi ; done
Một phương thức sử dụng find, với thao tác chuỗi tương tự, sử dụng mở rộng tham số bash, sẽ được đệ quy và sẽ nhanh hơn một chút so với phiên bản shell thuần:
find . -type f -exec bash -c 'target=/directory/to/store/alphabet/dirs ; mkdir -p "$target"; f="{}" ; i="${f##*/}"; i="${i:0:1}"; i=${i^}; if [[ $i = [[:alpha:]] ]]; then mkdir -p "${target}/$i" && mv "$f" "${target}/$i"; else mkdir -p "${target}/#" && mv "$f" "${target}/#"; fi' \;
Hoặc dễ đọc hơn:
find . -type f -exec bash -c 'target=/directory/to/store/alphabet/dirs
mkdir -p "$target"
f="{}"
i="${f##*/}"
i="${i:0:1}"
i=${i^}
if [[ $i = [[:alpha:]] ]]; then
mkdir -p "${target}/$i" && mv "$f" "${target}/$i"
else
mkdir -p "${target}/#" && mv "$f" "${target}/#"
fi' \;