То, что делает эта команда, скомпилировать mod_geoip
модуль и ссылка это против заголовков версии апача Вы используете.
При использовании запаса пакет Debian Apache затем, просто необходимо установить apache-dev
пакет (Вам, конечно, также будет нужно build-essential
если у Вас уже нет его). Вы, возможно, должны скорректировать ту команду для путей, которые Debian использует (если они отличаются), но иначе что команда должна хорошо работать.
Если последним аргументом был каталог, Вы просто переместили все файлы и каталоги в Вашем текущем рабочем каталоге (кроме тех, имена которых начинаются с точек) в тот каталог. Если было два файла, первый файл, возможно, перезаписал второй файл.
Вот некоторые демонстрации:
Больше чем два файла и последний аргумент являются файлом
$ mkdir d1 d2 d3
$ touch a b c e
$ mv *
mv: target 'e' is not a directory
Больше чем два файла и последний аргумент являются каталогом
$ mkdir d1 d2 d3
$ touch a b c
$ mv -v *
'a' -> 'd3/a'
'b' -> 'd3/b'
'c' -> 'd3/c'
'd1' -> 'd3/d1'
'd2' -> 'd3/d2'
Два файла
$ touch a b
$ mv -v *
'a' -> 'b'
Дальнейшее объяснение
Оболочка разворачивает шарик (*
) в аргументы в пользу mv
. Шарик обычно расширяется в алфавитном порядке. mv
всегда видит список файлов и каталоги. Это никогда не видит сам шарик.
Команда mv
поддержки два типа перемещения. Каждый mv file ... directory
. Другой mv old-file-name new-file-name
(или mv old-file-name directory/new-file-name
).
Сначала оболочка расширяется ./*
во все файлы в текущем каталоге (кроме файлов, запускающихся с точки).
mv
сбоиmv
сбои.echo ./*
действительно посмотрите который порядок Ваше использование оболочки (обычно алфавитный).
– jofel
24.07.2013, 01:00
mv
возвращает сообщение об ошибке, если это называют только с одним аргументом.
– jofel
06.02.2017, 14:13
missing destination file operand after *filename*
даже при том, что вчера это не сделало.
– Noumenon
06.02.2017, 14:19
Когда Вы вводите mv ./*
, Ваша оболочка расширится ./*
перед выполнением mv
.
Несколько вещей отметить:
./*
расширен меньше чем в 2 аргумента, mv
логически, произведет ошибку../*
будет обычно расширяться в каждый файл (включая каталог) существующий в текущем каталоге и не запускающийся с точки../*
расширяется в путем чтения документации оболочки (man 7 glob
точка входа к теме). Различные оболочки будут иметь различные варианты.Что делает
mv *
?
Вот более короткий ответ:
Оболочка расширяет подстановочный символ *
до списка содержимого каталога. Затем оболочка передает этот полный список команде. Команда никогда не видит *
.
Команда mv file1 file2 ... filen directory
переместит file1 ... filen в каталог.
Здесь я делаю тестовый каталог, содержащий три файла
$ mkdir t
$ cd t
$ echo a>a; echo b>b; echo c>c
$ ls
a b c
Вы не можете переместить несколько файлов в один файл
$ mv *
mv: target `c' is not a directory
Давайте добавим подкаталог
$ mkdir d
Вы можете переместить несколько файлов в подкаталог
$ mv *
$ ls
d
$ ls d
a b c
Сначала сделаю тестовую базу - 5 файлов и одна папка:
touch file1 file2 file3 file4 file5
mkdir folder
Затем я выполню тестовую команду. Параметр -v
указывает, что я хочу, чтобы каждая команда, выполняемая оболочкой, выводилась на stderr
. Параметр -x
указывает, что я хочу, чтобы то же самое было напечатано на stderr
- , но Я хочу, чтобы это было после оценка команды, но до оболочка запускает его.
sh -cxv 'echo mv *'
echo mv *
+ echo mv file1 file2 file3 file4 file5 folder
mv file1 file2 file3 file4 file5 folder
Итак, вы видите, что команда, которую я передаю оболочке, - это echo mv *
, а команда, выполняемая оболочкой после раскрытия *
, - echo mv
, за которым следуют все эти файлы и папка.
По умолчанию оболочка расширяет глобусы , например:
sh -cxv 'echo file[1-5]'
echo file[1-5]
+ echo file1 file2 file3 file4 file5
file1 file2 file3 file4 file5
Это результат функции set [+ -] f
glob:
sh -cxvf 'echo file[1-5]'
echo file[1-5]
+ echo 'file[1-5]'
file[1-5]
Таким образом, когда вы запускаете команду в оболочке, настроенной с параметрами по умолчанию, такими как mv *
, оболочка раскрывается в слово *
, список аргументов всех файлов в текущем каталоге, отсортированных в соответствии с к языку. Он выполняет системный вызов exec (ve)
для mv
(по сути) с добавленным списком аргументов. Итак, mv
получает все аргументы, когда оболочка их объединяет и сортирует. Помимо выполнения strace
, чтобы увидеть эти эффекты, вы можете снова использовать отладку, например:
sh -s -- mv * <<\SCRIPT
sed -n l /proc/$$/cmdline
echo "$@"
SCRIPT
sh\000-s\000--\000mv\000file1\000file2\000file3\000file4\000file5\000folder\
\000$
mv file1 file2 file3 file4 file5 folder
И переносимо:
( PS4= IFS=/; set -x mv *; : "/$*/" ) 2>&1
: /mv/file1/file2/file3/file4/file5/folder/
В основном оболочка выполняет mv
с содержимым каталога (если он не пуст и не включает файлы / папки с именами, начинающимися с .
) в качестве списка аргументов. mv
- это POSIX, указанный для интерпретации его последнего аргумента как каталога, если он вызывается с более чем двумя аргументами - точно так же ln
равно (потому что на самом деле они Невероятно похожие инструменты в базовых функциях) .
Достаточно echo
es:
sh -cxv 'mv *' ; ls
mv *
+ mv file1 file2 file3 file4 file5 folder
folder/
Все файлы были перемещены в последний аргумент - потому что это папка. Что, если это не папка?
sh -cxv 'cd *; mv *'; ls . *
cd *; mv *
+ cd folder
+ mv file1 file2 file3 file4 file5
mv: target ‘file5’ is not a directory
.:
folder/
folder:
file1 file2 file3 file4 file5
Вот как POSIX указывает, что mv
должен вести себя в этом случае:
mv [-if] source_file target_file
mv [-if] source_file... target_dir
В первой форме синопсиса
Утилита mv
должна переместить файл, названный операндом source_file, в место назначения, указанное в target_file . Эта первая форма синопсиса предполагается, когда последний операнд не называет существующий каталог и не является символической ссылкой, относящейся к существующему каталогу. В этом случае, если исходный_файл именует файл, не являющийся каталогом, а целевой_файл заканчивается завершающим символом/ косой чертой
,mv
обрабатывает это как ошибка, и операнды исходный_файл обрабатываться не будут.Во второй форме синопсиса
mv
должен переместить каждый файл, названный операндом source_file, в целевой файл в существующем каталоге, названном операндом target_dir , или на который будет ссылка, если target_dir - это символическая ссылка, указывающая на существующий каталог. Путь назначения для каждого исходного_файла должен быть конкатенацией целевого каталога, одним символом/ косой чертой
, если цель не оканчивается на/ косую черту
, и последним компонентом имени пути в исходный_файл . Эта вторая форма предполагается, когда последний операнд называет существующий каталог.
Итак, если *
расширяется до:
два файла
переименованным
во второй после того, как второй - ] отключен
. один или несколько файлов, за которыми последним следует каталог или ссылка на один
что-нибудь еще