Как переименовать / переместить все файлы с определенным расширением? - PullRequest
0 голосов
/ 17 февраля 2009

Я изучаю tcl (ожидаю), и теперь я пришел к интересной проблеме. Мне нужна команда для перемещения / переименования группы файлов с расширением .status. Я попробовал это:

spawn /bin/mv *.status some_dir
exec /bin/mv *.status some_dir

Конечно, это не сработало. Я немного погуглил и нашел кое-что о глобусе, но, похоже, он работает не так, как я хочу. Если я сделаю:

exec /bin/mv [glob *.status] somedir

mv жалуется, что «1.статус 2.статус 3.статус… и т. Д.» не является допустимым файлом Как будто весь список файлов объединяется в одну строку, а не обрабатывается отдельно.

Попытка найти дополнительную информацию через Google привела меня ко многим неработающим и устаревшим ссылкам, поэтому я надеюсь, что помимо решения этой проблемы, не могли бы вы указать мне какой-нибудь хороший онлайн-ресурс для tcl / ожидаемых основ и распространенных ошибок. 1011 *

Обновление: Принимаются только решения, использующие стандартные tcl и стандартные инструменты в / bin.

Ответы [ 5 ]

5 голосов
/ 17 февраля 2009

Ответ Рэнди короткий и правильный, но без необходимости использует исполнителя. Ответ Джозефа очень убедительный, но немного длинный.

Для краткого и идиоматического ответа я бы использовал (требуется Tcl 8.5):

переименование файла {*} [glob * .status] some_dir

2 голосов
/ 17 февраля 2009
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/
1 голос
/ 17 февраля 2009
$ 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
0 голосов
/ 17 февраля 2009

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

Это также способ обрабатывать эти случайные файлы с краями вручную.

0 голосов
/ 17 февраля 2009

Это решение работает с файлами с именами, содержащими пробелы, когда файлов много и т. Д .:

exec find -maxdepth 1 -name *.status -print0 | xargs -0 mv -t some_dir

Но для этого нужны find и xargs, которые чаще всего находятся в / usr / bin, а не /bin.

...