Import Old Personal Dictionaries into Aspell Safely
You will finish with old Ispell and Aspell personal dictionaries imported into the format used by GNU Aspell, plus a record of what the command changed. This guide uses aspell-import from Aspell 0.60.8.1, installed here as Debian package aspell 0.60.8.1-1build1.
The route
Jump straight to the step you need, or tick off Done means at the end.
Allow about fifteen minutes. You need a shell, the aspell package and a backup of the home directory that contains the old dictionary files. The command changes files in that home directory, so keep a copy before you begin. It does not need root privileges when importing your own files.
1. Check the command and its contract
Confirm which executable will run and record the installed package version:
$ command -v aspell-import
/usr/bin/aspell-import
$ dpkg-query -W -f='${Package} ${Version}\n' aspell
aspell 0.60.8.1-1build1
The installed manpage gives aspell-import no command-line options. Run it as a command on its own. Do not append guessed flags such as a language or a directory: this utility discovers files in the home directory represented by HOME.
Checkpoint: if command -v finds nothing, install the package using your normal system package process, then repeat this check. Do not run a similarly named script copied from an untrusted directory.
2. Identify the files it can discover
Before importing, inspect the home directory that will be searched. The command looks for two groups of names:
.ispell_*, the older Ispell personal dictionaries;.aspell.*.*, including Aspell personal files ending in.pwsor.per, and replacement files ending in.prepl.
Use a shell glob check without opening or changing anything:
printf '%s\n' "$HOME"
for file in "$HOME"/.ispell_* "$HOME"/.aspell.*.*; do
[ -e "$file" ] && printf '%s\n' "$file"
done
A missing match is not an error. The shell leaves an unmatched glob unchanged, which is why the [ -e ] test is present. Treat the printed list as the import set. If it includes a file you did not expect, stop and inspect it before proceeding.
3. Make a recoverable backup
Copy the discovered files to storage you can restore from. A simple example creates a dated directory under a separate backup location:
backup_dir="$HOME/aspell-import-backup-2026-09-22"
mkdir -- "$backup_dir"
cp -- "$HOME"/.ispell_* "$HOME"/.aspell.*.* "$backup_dir"/
The globs in the final command must match at least one file. If your inspection found only one family, copy that family instead. For example, use cp -- "$HOME"/.ispell_american "$backup_dir"/ when that is the only match. Keep the backup until you have checked the imported dictionary.
This is the safety boundary: aspell-import overwrites or regenerates personal files through Aspell. If the result is wrong, stop using the generated files, move them aside, and restore the originals from backup_dir. Do not restore over a file while an Aspell process is writing it.
4. Run the import
Run the command from an ordinary shell:
$ aspell-import
Processing "~/.ispell_american", lang = en
Merging en
@(#) International Ispell Version 3.1.20 (but really Aspell 0.60.8.1)
Your output depends on the files and languages found. The command prints one Processing line for each recognised dictionary, then a Merging line for each language it can merge. The language name is inferred from the filename and mapped to an Aspell language code. There is no interactive confirmation prompt.
The displayed language mapping is a useful trap check. A filename with an unrecognised language name is skipped with a warning, except for a two-letter name that the script treats as already abbreviated. That does not prove the dictionary contents are correct. Check the output before moving on.
5. Verify the generated personal files
Record the command's status immediately:
$ printf 'exit status: %s\n' "$?"
exit status: 0
Status 0 means the script completed its processing loop. It is not a count of imported words. List the files again and compare them with the backup:
find "$HOME" -maxdepth 1 -type f \
\( -name '.ispell_*' -o -name '.aspell.*.*' \) -printf '%f\n' | sort
diff -u "$backup_dir/.aspell.en.pws" "$HOME/.aspell.en.pws"
Replace the example .aspell.en.pws path with a file that exists on your machine. A difference is expected when the old data has been merged. An unchanged source file is also possible: the utility reads old files and sends their entries to Aspell, while the resulting personal and replacement files are managed by Aspell itself.
For a content check, ask Aspell about a word you deliberately imported:
$ printf '%s\n' 'legacyword' | aspell --lang=en list
legacyword
Use a real word from your dictionary and the matching language code. If the word is not printed, it was not accepted as an unrecognised word by that invocation. Check the language, the source format and the generated file before retrying.
6. Recover from a bad import
Do not rerun the command repeatedly while guessing. First preserve the current generated files in a separate directory, then restore the original files from the backup:
failed_dir="$HOME/aspell-import-after-failure-2026-09-22"
mkdir -- "$failed_dir"
cp -- "$HOME"/.aspell.*.* "$failed_dir"/ 2>/dev/null || true
cp -- "$backup_dir"/.ispell_* "$HOME"/ 2>/dev/null || true
cp -- "$backup_dir"/.aspell.*.* "$HOME"/ 2>/dev/null || true
Review the copied files before deleting anything. The example uses true only to tolerate a backup that contains one file family rather than both. It does not hide failures from the earlier inspection or import command. If the backup is incomplete, stop and recover it from your separate backup system instead of reconstructing dictionary data by hand.
Done means
aspell-importran from the intended Aspell installation and returned status 0.- Every processed filename and language appeared in output as expected.
- The generated personal or replacement files were compared with the backup.
- A known imported word was checked with the matching Aspell language.
- The original files and the post-import files are both recoverable.