Когда вы вводите команду:
mv *.txt *.tsv
оболочка, предположим bash, расширяет символы подстановки, если есть какие-либо подходящие файлы (включая каталоги). Список файлов передается в программу, здесь mv. Если совпадений не найдено, расширенная версия пропускается.
Опять же: оболочка расширяет шаблоны, а не программу.
Множество примеров, пожалуй, лучший способ, так что здесь мы идем:
Пример 1:
$ ls
file1.txt file2.txt
$ mv *.txt *.tsv
Теперь в mvстроке происходит то, что оболочка расширяется *.txtдо соответствующих файлов. Как нет *.tsvфайлов, которые не изменены.
Команда mvвызывается с двумя специальными аргументами :
argc: Количество аргументов, включая программу.
argv: Массив аргументов, включая программу в качестве первой записи.
В приведенном выше примере это будет:
argc = 4
argv[0] = mv
argv[1] = file1.txt
argv[2] = file2.txt
argv[3] = *.tsv
mvПроверка программы , чтобы увидеть , если последний аргумент, *.tsvявляется каталогом. Поскольку это не так, программа не может продолжаться, так как она не предназначена для объединения файлов. (Обычно перемещают все файлы в один.) И не создавайте каталоги по прихоти.
В результате он прерывает работу и сообщает об ошибке:
mv: target ‘*.tsv’ is not a directory
Пример 2:
Теперь, если вы вместо этого скажете:
$ mv *1.txt *.tsv
Команда mvвыполняется с:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[2] = *.tsv
Теперь, снова, mvпроверьте, если *.tsvсуществует. Поскольку это не файл file1.txtперемещен в *.tsv. То есть: файл переименован *.tsvв звездочку и все.
$ mv *1.txt *.tsv
‘file1.txt’ -> ‘*.tsv’
$ ls
file2.txt *.tsv
Пример 3:
Если вы вместо этого сказали:
$ mkdir *.tsv
$ mv *.txt *.tsv
Команда mvвыполняется с:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[1] = file2.txt
argv[2] = *.tsv
Поскольку *.tsvтеперь это каталог, файлы в конечном итоге перемещаются туда.
Теперь: используя команды, например, some_command *.tsvкогда намерение состоит в том, чтобы на самом деле оставить подстановочный знак, его всегда следует заключать в кавычки. Заключая в кавычки, вы препятствуете расширению подстановочных знаков, если должны быть какие-либо совпадения. Например, сказать mkdir "*.tsv".
Пример 4:
Расширение можно просмотреть, если вы сделаете, например:
$ ls
file1.txt file2.txt
$ mkdir *.txt
mkdir: cannot create directory ‘file1.txt’: File exists
mkdir: cannot create directory ‘file2.txt’: File exists
Пример 5:
Теперь: mvкоманда может работать над несколькими файлами. Но если их больше двух, последний должен быть целевым каталогом. (При желании вы можете использовать -t TARGET_DIRопцию, по крайней мере, для GNU mv.)
Так что все в порядке:
$ ls -F
b1.tsv b2.tsv f1.txt f2.txt f3.txt foo/
$ mv *.txt *.tsv foo
Здесь mvбудет называться с:
argc = 7
argv[0] = mv
argv[1] = b1.tsv
argv[2] = b2.tsv
argv[3] = f1.txt
argv[4] = f2.txt
argv[5] = f3.txt
argv[6] = foo
и все файлы попадают в каталог foo.
Что касается ваших ссылок. Вы предоставили один (в комментарии), где mvвообще не упоминается, но rename. Если у вас есть больше ссылок, вы могли бы поделиться. Как и для страниц руководства, где вы заявляете, это выражено.