Как переименовать/переместить все файлы с определенным расширением?

StackOverflow https://stackoverflow.com/questions/556316

  •  05-09-2019
  •  | 
  •  

Вопрос

Я изучаю 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.

В целях безопасности при использовании сложных команд «поиск» и возможном удалении данных я вставляю «эхо» перед командой и записываю его в файл.
Затем я могу проверить команды, перечисленные в файле, прежде чем использовать «источник» для его запуска.

Это также способ обработки редких файлов вручную.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top