Как переименовать/переместить все файлы с определенным расширением?
Вопрос
Я изучаю tcl (ожидаю) и вот подошел к интересному вопросу.Мне нужна команда для перемещения/переименования группы файлов с расширением .status.Я попробовал это:
spawn /bin/mv *.status some_dir
exec /bin/mv *.status some_dir
Конечно, это не сработало.Я немного погуглил и нашел кое-что о glob, но, похоже, он работает не так, как я хочу.Если я сделаю:
exec /bin/mv [glob *.status] somedir
МВ жалуется, что '1.status 2.status 3.status...etc.' является некорректным файлом.Это как если бы весь список файлов объединялся в одну строку, а не обрабатывался отдельно.
Попытка найти дополнительную информацию через Google привела меня к множеству неработающих и устаревших ссылок, поэтому я надеюсь, что помимо решения этой проблемы, не могли бы вы указать мне на какой-нибудь хороший онлайн-ресурс, посвященный основам tcl/expect и типичным ошибкам.
Обновлять: Будут приняты только решения, использующие стандартный tcl и стандартные инструменты в /bin.
Решение
$ ls -1 1.status 2.status rename.tclsh* some_dir/ two words.status $ cat rename.tclsh #!/usr/local/bin/tclsh eval exec /bin/mv [glob *.status] some_dir $ ./rename.tclsh $ ls -1 rename.tclsh* some_dir/ $ ls -1 some_dir/ 1.status 2.status two words.status
Другие советы
Ответ Рэнди короткий и правильный, но исполнительный директор используется без необходимости.Ответ Джозефа очень надежный, но немного длинный.
Для короткого и идиоматического ответа я бы использовал (требуется Tcl 8.5):
переименование файла {*}[glob *.status] some_dir
proc move_to_dir {filenames dirname} {
foreach filename $filenames {
file rename $filename [file join $dirname [file tail $filename]]
}
}
# Example:
move_to_dir [glob -nocomplain *.status] ~/foo/bar/
Это решение работает с файлами, имена которых содержат пробелы, когда файлов много и т. д.:
exec find -maxdepth 1 -name *.status -print0 | xargs -0 mv -t some_dir
Но для этого нужны find и xargs, которые чаще всего находятся в /usr/bin, а не в /bin.
В целях безопасности при использовании сложных команд «поиск» и возможном удалении данных я вставляю «эхо» перед командой и записываю его в файл.
Затем я могу проверить команды, перечисленные в файле, прежде чем использовать «источник» для его запуска.
Это также способ обработки редких файлов вручную.