Я хочу переименовать файлы, чтобы изменить их расширение, эффективно пытаясь достичь
mv *.txt *.tsv
Но при этом я получаю:
* .tsv не является каталогом
Я нахожу несколько странным, что первые 10 показов Google mv
должны работать следующим образом.
Ответы:
Когда вы вводите команду:
оболочка, предположим bash, расширяет символы подстановки, если есть какие-либо подходящие файлы (включая каталоги). Список файлов передается в программу, здесь
mv
. Если совпадений не найдено, расширенная версия пропускается.Опять же: оболочка расширяет шаблоны, а не программу.
Множество примеров, пожалуй, лучший способ, так что здесь мы идем:
Пример 1:
Теперь в
mv
строке происходит то, что оболочка расширяется*.txt
до соответствующих файлов. Как нет*.tsv
файлов, которые не изменены.Команда
mv
вызывается с двумя специальными аргументами :argc
: Количество аргументов, включая программу.argv
: Массив аргументов, включая программу в качестве первой записи.В приведенном выше примере это будет:
mv
Проверка программы , чтобы увидеть , если последний аргумент,*.tsv
является каталогом. Поскольку это не так, программа не может продолжаться, так как она не предназначена для объединения файлов. (Обычно перемещают все файлы в один.) И не создавайте каталоги по прихоти.В результате он прерывает работу и сообщает об ошибке:
Пример 2:
Теперь, если вы вместо этого скажете:
Команда
mv
выполняется с:Теперь, снова,
mv
проверьте, если*.tsv
существует. Поскольку это не файлfile1.txt
перемещен в*.tsv
. То есть: файл переименован*.tsv
в звездочку и все.Пример 3:
Если вы вместо этого сказали:
Команда
mv
выполняется с:Поскольку
*.tsv
теперь это каталог, файлы в конечном итоге перемещаются туда.Теперь: используя команды, например,
some_command *.tsv
когда намерение состоит в том, чтобы на самом деле оставить подстановочный знак, его всегда следует заключать в кавычки. Заключая в кавычки, вы препятствуете расширению подстановочных знаков, если должны быть какие-либо совпадения. Например, сказатьmkdir "*.tsv"
.Пример 4:
Расширение можно просмотреть, если вы сделаете, например:
Пример 5:
Теперь:
mv
команда может работать над несколькими файлами. Но если их больше двух, последний должен быть целевым каталогом. (При желании вы можете использовать-t TARGET_DIR
опцию, по крайней мере, для GNU mv.)Так что все в порядке:
Здесь
mv
будет называться с:и все файлы попадают в каталог
foo
.Что касается ваших ссылок. Вы предоставили один (в комментарии), где
mv
вообще не упоминается, ноrename
. Если у вас есть больше ссылок, вы могли бы поделиться. Как и для страниц руководства, где вы заявляете, это выражено.источник
Я знаю, что это не отвечает на ваш вопрос, но если вы искали другой способ переименования файлов по сравнению с циклом обхода, почему бы не использовать
find
? Я много раз использовал эту команду, чтобы заменить расширения файлов в больших каталогах сотнями тысяч файлов. Это должно работать на любой POSIX-совместимой системе:Распределение команд:
Пример:
источник
file.abc
->blub.xyz
в нескольких подкаталогах:find . -name "file.abc" -exec sh -c 'mv "$1" "$(dirname $1)/blub.xyz"' _ {} \;
mv *.txt *.tsv
не работает;mv
может переименовывать только один файл за раз. Вы либо неправильно поняли объяснения, либо они неверны.mmv
иrename
может переименовать несколько файлов одновременно. Но есть две версииrename
вокруг, которые называются по-разному. Здесь должно быть много вопросов об этом.источник
rename
, а неmv
.mv *.txt *.tsv
mv
(обычно) не видит*.txt
или*.tsv
только имена файлов, расширенных оболочкой. Количество файлов, к которым расширяются эти символы, будет «случайным». Единственная ситуация, когда это работает, - это наличие файла с именем,*.txt
которое должно быть переименовано (буквально)*.tsv
(без цитированияbash
опцияnullglob
не должна быть установлена).foo.txt
и один с именем перезаписывает существующий файл ...baz.tsv
mv *.txt *.tsv
.tsv
Например, если у вас есть
asd.txt
иqwe.txt
файлы в каталоге при выполнении командыmv *.txt *.tsv
, он пытается переместить эти файлы в папку с именем*.tsv
. Поскольку такого каталога нет, выдается ошибка.источник
rename(1)
rename
сценарий Perl Ларри Уолла, создателя Perl. Он принимает регулярное выражение Perl и работает с именем файла.Установка
Debian / Ubuntu
Если вам нужно установить
rename
на Debian / Ubuntu, вы можете сделатьисточник
Еще один вариант, который стоит рассмотреть:
*.txt
файлы*.tsv
, сохраняя их атрибуты с использованием-p
флага.*.txt
mv
просто изменение каталога / directory / filename без фактического перемещения файлов, если они не находятся в другом разделе.источник