Когда вы вводите команду:
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
. Если у вас есть больше ссылок, вы могли бы поделиться. Как и для страниц руководства, где вы заявляете, это выражено.