Да, вы можете сделать это с for
. Даже если есть «какой-то более простой способ сделать это sort
» (но я так не думаю), это также довольно просто:
# cd to the directory you want to process mkdir sorted for file in *; do printf 'Processing %s\n' "$file" [ -f "$file" ] && sort -u "$file" > "./sorted/$file" done
Заметки:
for file in *
не обрабатывает файлы в подкаталогах.printf
только сообщить о прогрессе. Фактически это должно быть размещено после[ ... ]
(см. Ниже), но я не хочу слишком усложнять код. Вы можете просто удалитьprintf
строку, если хотите, чтобы все это было тихим.[ -f "$file" ]
проверяет,$file
является ли обычный файл. С наиболее общим шаблоном (то есть*
) нам нужно это условие по крайней мере, чтобы избежать работыsort
сsorted
каталогом в качестве аргумента (это приведет к ошибке, безвредной, но не элегантной). Скорее всего, этот тест не понадобится, если вы используете более конкретный глобус, например*.txt
или*.db
вместо*
(например, для пропуска случайногоdesktop.ini
файла, который не должен обрабатываться). В этом случае вы можете опустить[ ... ] &&
и начать строку сsort
(оставляя линию нетронутой, однако, не повредит).sort
поддерживает различные варианты, и вы можете использовать некоторые из них, в зависимости от того, как вам нужно сортировать.sort -u
Дедуплицирует записи сразу после их сортировки и, когда они уже используются,sort
является менее излишней альтернативой использованиюuniq
команды.
Если вам нужно выбрать файлы в соответствии с более сложными условиями, чем простой глобус, find
лучше начать с этого. Для вашей текущей задачи for
должно быть хорошо.